MS - 1 - 把二元查找树转变成排序的双向链表
## 1. 把二元查找树转变成排序的双向链表 ##
### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 ###
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表 4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
下面是使用C++泛型写的一种算法:
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std; template<typename T>
struct BSTTreeNode
{
BSTTreeNode(T v, BSTTreeNode* lNode = NULL, BSTTreeNode* rNode=NULL)
:m_Value(v), m_pLeft(lNode), m_pRight(rNode){}
T m_Value;
BSTTreeNode* m_pLeft;
BSTTreeNode* m_pRight;
}; template<typename T>
void TravelBSTree(BSTTreeNode<T> *root)
{
if (NULL == root)
{
return;
} TravelBSTree(root->m_pLeft); printf("%d ", root->m_Value); TravelBSTree(root->m_pRight); } template<typename T>
void TravelBSTreeAsList(BSTTreeNode<T> *head, bool bReverseTravel = false)
{
BSTTreeNode<T>* pNode = head;
while (pNode)
{
printf("%d ", pNode->m_Value);
if (!bReverseTravel)
{
pNode = pNode->m_pRight;
}
else
{
pNode = pNode->m_pLeft;
}
}
} //思路:
//查找树,中序遍历得到的节点排序即为排序的链表,而要求排序的双向链表,
//1. 假设lt为左子树的中序遍历的尾结点,rh为右子树中序遍历的头结点
//2. 化繁为简,如果只有root, lt, rh三个节点,此时只须然这几个节点连接起来即可。
//3. 分别遍历左右子树,重复上述过程。
template<typename T>
void BSTreeHelper(BSTTreeNode<T>* &head, BSTTreeNode<T>* &tail, BSTTreeNode<T>* root)
{
//step 1.
BSTTreeNode<T>* lt = NULL;//左子树尾结点
BSTTreeNode<T>* rh = NULL;//右子树头结点 if (NULL == root)
{
head = nullptr;
tail = nullptr;
return;
} //step 3.
BSTreeHelper(head, lt, root->m_pLeft);
BSTreeHelper(rh, tail, root->m_pRight); //step 2.
if (NULL != lt)
{
lt->m_pRight = root;
root->m_pLeft = lt;
}
else
{
head = root;
} if (NULL != rh)
{
root->m_pRight = rh;
rh->m_pLeft = root;
}
else
{
tail = root;
}
} template<typename T>
BSTTreeNode<T>* TreeToLinkedList(BSTTreeNode<T>* root)
{
BSTTreeNode<T>* head = NULL;
BSTTreeNode<T>* tail = NULL; BSTreeHelper(head, tail, root); return head;
} int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = {, , , , , , }; BSTTreeNode<int> node4();
BSTTreeNode<int> node8();
BSTTreeNode<int> node6(, &node4, &node8);
BSTTreeNode<int> node12();
BSTTreeNode<int> node16();
BSTTreeNode<int> node14(, &node12, &node16);
BSTTreeNode<int> node10(, &node6, &node14);
BSTTreeNode<int>* pRoot = &node10; printf("Travel BSTree: \n");
TravelBSTree<int>(pRoot);
printf("\n"); TreeToLinkedList<int>(pRoot); printf("Travel BSTree: \n");
TravelBSTreeAsList<int>(&node4, false);
printf("\n"); TravelBSTreeAsList<int>(&node16, true);
printf("\n"); return ;
}
MS - 1 - 把二元查找树转变成排序的双向链表的更多相关文章
- 二元查找树转变成排序的双向链表之C#算法实现
此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试 ...
- 【Data structure & Algorithm】把二元查找树转变成排序的双向链表
把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新节点,只调整指针指向. 比如将二元查找树 10 / \ 6 ...
- 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]
[题目]:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 . 10 / \ 6 14 / \ / \ 4 8 12 16 转 ...
- IT公司100题-15-求二元查找树的镜像
问题描述: 输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树. 例如输入: 6/ \4 12/ \ / \2 5 8 16 输出: 6/ ...
- IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果
问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树 ...
- 6.二元查找树的后序遍历结果[PostOrderOfBST]
[题目] 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 ...
- 11.求二元查找树的镜像[MirrorOfBST]
[题目] 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点.用递归和循环两种方法完成树的镜像转换. 例如输入: 8 / \ 6 1 ...
- HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)
HTTP协议漫谈 简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...
- 数据结构:JAVA_二叉数查找树基本实现(上)
数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. ..... 2.代码分解 2.1 对节点的结构定义 ...
随机推荐
- oracle表分区详解(按天、按月、按年等)
分区表的概念: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间 ...
- LeetCode----Tree
Path Sum II 思路:回溯 public List<List<Integer>> pathSum(TreeNode root, int sum) { List<L ...
- Selenium2入门(一)简介
Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 WebDriver(Selenium 的并行项目)中的最佳特 ...
- 崽崽帮www.zaizaibang.com精选2
崔其亮-儿科专科 智慧熊北京丰台幼儿园——秋游活动 周边景点——哈尔滨旅游攻略 月是故乡明丨那些买给自己吃的常德手工月饼老店 [周末乐游]南京最美10所大学,这个周末一起逛一逛吧 彭韶-儿科二门诊 [ ...
- json在项目中的应用大总结
一.摘要 刚开始接触json的时候,那时候还不太清楚json到底是个什么东西,然后就在项目中使用了它.因为没有搞明白json的本质,所以刚开始使用json的时候走了不少弯路.这次总结一些json的知识 ...
- makefile函数
http://www.cnblogs.com/tianyajuanke/archive/2013/02/16/2610276.html 通用步骤: 编译时,可以不知钉头文件,如果指定头文件,其作用是当 ...
- 写出形似QML的C++代码
最开始想出的标题是<Declarative C++ GUI库>,但太标题党了.只写了两行代码,连Demo都算不上,怎么能叫库呢……后来想换掉“库”这个字,但始终找不到合适词来替换.最后还是 ...
- mount不是很熟悉 转载文章了解下 转自http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=257333
纯粹针对刚刚解封开包的新新手,老鸟们请自觉绕行,否则浪费你的时间你非要逼我做谋杀犯可不光我的事你还没地方说理去.如果你正好是个崭新的新手,就耐心的花点时间看看吧,至少大概看看,不要在一个陌生又黑暗的到 ...
- Spring自定义缓存管理及配置Ehcache缓存
spring自带缓存.自建缓存管理器等都可解决项目部分性能问题.结合Ehcache后性能更优,使用也比较简单. 在进行Ehcache学习之前,最好对Spring自带的缓存管理有一个总体的认识. 这篇文 ...
- html-tab page
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...