// Test2.cpp : 定义控制台应用程序的入口点。
//程序员面试100题(算法)之把二叉查找树转变成排序的双向链表
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
struct BSTreeNode
{
BSTreeNode *leftNode;
BSTreeNode *rightNode;
int value;
};
BSTreeNode* createBiTree(BSTreeNode *&tNode)
{
int value = 0;
cin >> value;
if(value == -1)
{
tNode = NULL;
}
else
{
tNode = (BSTreeNode*)malloc(sizeof(BSTreeNode));
if(!tNode)
{
cout << "Out of space!" << endl;
return NULL;
}
else
{
tNode->value = value;
createBiTree(tNode->leftNode);
createBiTree(tNode->rightNode);
}
}
return tNode;
}
void convertBSTreeToLinklist(BSTreeNode *node, BSTreeNode *&tailOfLinklist)
{
if(!node)
{
return;
}
BSTreeNode *currentNode = node;
if(currentNode->leftNode)
{
convertBSTreeToLinklist(currentNode->leftNode, tailOfLinklist);
}
currentNode->leftNode = tailOfLinklist;
if(tailOfLinklist)
tailOfLinklist->rightNode = currentNode;
tailOfLinklist = currentNode;
if(currentNode->rightNode)
{
convertBSTreeToLinklist(currentNode->rightNode, tailOfLinklist);
}
}
BSTreeNode *convertSolution(BSTreeNode *root)
{
BSTreeNode *tailOfLinklist = NULL;
convertBSTreeToLinklist(root, tailOfLinklist);
while(tailOfLinklist->leftNode)
{
tailOfLinklist = tailOfLinklist->leftNode;
}
return tailOfLinklist;
}
void printLinklist(BSTreeNode *head)
{
if(head)
{
while(head)
{
cout << head->value << "\t";
head = head->rightNode;
}
cout << endl;
}
else
{
cout << "The double link list is empty" << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
BSTreeNode* bTree = NULL;
BSTreeNode* headOfLinklist = NULL;
cout << "Create the BSTree with preorder:" <<endl;
cout << "Please enter the integer, -1 means node is empty." <<endl;
bTree = createBiTree(bTree);
cout << "Starting convert the BSTree to double link list" <<endl;
headOfLinklist = convertSolution(bTree);
cout << "Print the double link list" <<endl;
printLinklist(headOfLinklist);
return 0;
}
分享到:
相关推荐
树 * 字典树 * 遍历-层次遍历 * 遍历-中序遍历-非递归 ...* 二叉查找树-从有序链表构造平衡的二叉查找树 * 二叉树-的最大深度 数组&字符串 查找排序 排列组合 动态规划 树 链表 数学 位运算 编程之美
稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...
二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红...
第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,...
二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红-黑树 第10章 2...
全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和队列、链表、递归、进阶排序、二叉树、红黑树、哈希表及图形等知识。附录中则提供了运行专题Applet和例程、相关书籍和问题解答。本书提供了学完一门编程...
线性表综合题 (1) 按照输入的顺序建立顺序表 (2) 对顺序表进行排序(直接插入、冒泡、选择、快速、合并) (3) 按照由大到小的顺序建立一个单链表 (4) 链表逆置 (5) 将顺序表和链表合并成一个有序表。...
15.3.3 创建二叉查找树 435 15.3.4 遍历二叉查找树 437 15.3.5 二叉查找树操作的效率 437 第16章 树的实现 443 16.1 二叉树中的节点 444 16.1.1 基于数组的表示 444 16.1.2 基于链表的表示 446 16.2 ADT...
“第2篇算法基本应用篇”详细讲解了算法在排序、查找、数值计算、数论、经典趣题和游戏中的应用;“第3篇算法高级应用篇”讲解了算法的一些高级应用技术,包括在密码学和数据压缩/解压缩中的应用。 《C/C++常用算法...
二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章...
二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章...
《算法导论》是一本好书,但是他太难了,就算是现在的我,再不借助资料的情况下,也绝看不...超四十种常见算法思想:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
该程序员面试指南涉及栈,队列,链表,二叉树,递归和动态规划以及字符串等算法以及常见数据结构的算法题详解,非常适合正在学习算法或者是正在找工作的人群,希望会对你们有所帮助
11.2.4 二叉树的二叉链表存储 11.2.5 二叉树的三叉链表存储 11.3 遍历二叉树 11.3.1 先序遍历 11.3.2 中序遍历 11.3.3 后序遍历 11.3.4 广度优先(按层)遍历 11.4 森林、树和二叉树的转换 11.4.1 森林、树...
05_面试题强化_多态相关 06_父类指针的步长和子类指针的步长不一样 07_课堂答疑什么时候子类的步长和父类的步长一样 08_抽象类基本语法 09_抽象类在多继承中的应用 10_面向抽象类编程_计算程序员工资 11_中午课程...
面试考算法,通过率极低 看过c、c++、java版算法,javascript不会写 怎么学算法 通过“解题”夯实基础算法 理解算法的本质学会挖掘“规律” 举一反三学会变通和延伸 基础算法 字符串 反转字符串中的单词 计算二进制...
leetcode中国 记录在大学期间学习的一些数据结构与算法的代码实现 数据结构 数组 链表 二叉树 栈队列 算法 排序 递归 贪心算法 动态规划 剑指Offer练习题
实现一种算法来验证二叉树是否已排序。 看 我有一个链表,可能有一个循环。 如何判断是否存在循环? 复杂度如何? 见 - O(1) 时间,O(n) 空间 我有两个不适合任何 Java 数字类型的大数(即,忽略 BigDecimal 和 ...
个算法分别是:二分法,递归,回溯法,排序,双指针,滑动窗口,并查集 5 个算法思想分别是:分治,贪心,深度优先遍历,广度优先遍历,动态规划 (二)题目分类 Array List Math Stack String Tree (三)题目代码 ...