`
v5qqbrowser
  • 浏览: 355994 次
文章分类
社区版块
存档分类
最新评论

程序员面试100题(算法)之把二叉查找树转变成排序的双向链表(含二叉树前序创建、递归)

 
阅读更多
// 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;
}

分享到:
评论

相关推荐

    python 数据结构 算法 LeetCode 牛客 面试 编程之美 动态规划 字典树 快速排序 树 字符串 数组 链表 全排列

    树 * 字典树 * 遍历-层次遍历 * 遍历-中序遍历-非递归 ...* 二叉查找树-从有序链表构造平衡的二叉查找树 * 二叉树-的最大深度 数组&字符串 查找排序 排列组合 动态规划 树 链表 数学 位运算 编程之美

    【超全!】图解Java数据结构和算法(共195集)【资料+视频+课件+代码+笔记】

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...

    java数据结构与算法第二版

    二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红...

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

    第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,...

    Java数据结构和算法(第二版)

    二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红-黑树 第10章 2...

    Java数据结构和算法中文第二版

    全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和队列、链表、递归、进阶排序、二叉树、红黑树、哈希表及图形等知识。附录中则提供了运行专题Applet和例程、相关书籍和问题解答。本书提供了学完一门编程...

    数据结构课程设计作业+源代码+文档说明

    线性表综合题 (1) 按照输入的顺序建立顺序表 (2) 对顺序表进行排序(直接插入、冒泡、选择、快速、合并) (3) 按照由大到小的顺序建立一个单链表 (4) 链表逆置 (5) 将顺序表和链表合并成一个有序表。...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    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...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    “第2篇算法基本应用篇”详细讲解了算法在排序、查找、数值计算、数论、经典趣题和游戏中的应用;“第3篇算法高级应用篇”讲解了算法的一些高级应用技术,包括在密码学和数据压缩/解压缩中的应用。 《C/C++常用算法...

    Java数据结构和算法中文第二版(2)

    二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章...

    Java数据结构和算法中文第二版(1)

    二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章...

    为什么有人说弄懂了《算法导论》的 的 90%,就超越了 90%的程序员?

    《算法导论》是一本好书,但是他太难了,就算是现在的我,再不借助资料的情况下,也绝看不...超四十种常见算法思想:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

    算法与数据结构题目最优解

    该程序员面试指南涉及栈,队列,链表,二叉树,递归和动态规划以及字符串等算法以及常见数据结构的算法题详解,非常适合正在学习算法或者是正在找工作的人群,希望会对你们有所帮助

    突破程序员基本功的16课.part2

    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_中午课程...

    leetcode会员怎么买便宜-leetcode:javascript数据结构和算法

    面试考算法,通过率极低 看过c、c++、java版算法,javascript不会写 怎么学算法 通过“解题”夯实基础算法 理解算法的本质学会挖掘“规律” 举一反三学会变通和延伸 基础算法 字符串 反转字符串中的单词 计算二进制...

    leetcode中国-DataStructure-Algorithm::rainbow:数据结构&算法&剑指Offer&程序员代码面试指南

    leetcode中国 记录在大学期间学习的一些数据结构与算法的代码实现 数据结构 数组 链表 二叉树 栈队列 算法 排序 递归 贪心算法 动态规划 剑指Offer练习题

    程序员为什么还要刷题-interviewquestions:面试问题

    实现一种算法来验证二叉树是否已排序。 看 我有一个链表,可能有一个循环。 如何判断是否存在循环? 复杂度如何? 见 - O(1) 时间,O(n) 空间 我有两个不适合任何 Java 数字类型的大数(即,忽略 BigDecimal 和 ...

    leetcode小岛出水口-LeetCode:通过不断的实践加深对数据结构和算法的理解

    个算法分别是:二分法,递归,回溯法,排序,双指针,滑动窗口,并查集 5 个算法思想分别是:分治,贪心,深度优先遍历,广度优先遍历,动态规划 (二)题目分类 Array List Math Stack String Tree (三)题目代码 ...

Global site tag (gtag.js) - Google Analytics