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 对节点的结构定义 ...
随机推荐
- compile vim with lua & python support
vim在macosx 10.9默认没有带lua和python支持,因为装的有些插件是lua写的,有些是python写的,运行不起来,于是决定自己编译一个,下载vim源码,执行以下命令就可以编译vim: ...
- nginx beginners_guide
http://nginx.org/en/docs/beginners_guide.html https://www.nginx.com/resources/wiki/start/topics/tuto ...
- EX:The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
EX:The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secu ...
- 从css谈模块化
模块化是现今我们随处都可以听到的一个名词,什么是模块化?为什么我们需要模块化?这是本系列文章我们要弄明白的一个问题.我们也借这部分内容,顺带回顾一下前端的发展历程. 说实话,模块化这个主题有点大,我一 ...
- Angular $scope和$rootScope事件机制之$emit、$broadcast和$on
Angular按照发布/订阅模式设计了其事件系统,使用时需要“发布”事件,并在适当的位置“订阅”或“退订”事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$s ...
- CentOS 6主机上的RStudio Server安装步骤
1. 安装EPEL库 yum -y install epel-release 2. 安装R yum install R 3. 安装OpenSSL yum install openssl098e 4. ...
- IOS开发之--UIScrollView pagingEnabled自定义翻页宽度
用到UIScrollview的翻页效果时,有时需要显示一部分左右的内容,但是UIScrollView的PagingEnabled只能翻过整页,下面几个简单的设置即可实现 技术点: 1. 创建一个继承U ...
- 如何通过WPS 2013 API 将Office(Word、Excel和PPT)文件转PDF文件
1. 描述 PDF 文件是一种便携文件格式,是由Adobe公司所开发的独特的跨平台文件格式.PDF文件以PostScript语言图象模型为基础,无论在哪种打印机上都可保证精确的颜色和准确的打印效果,即 ...
- EL总结
El: 1.el表达式语言(是什么) 2.el是书写到jsp页面 3.el语法格式${ } 4.el算数运算(+,-,*,/,%), 逻辑运算(&&,||,!), 关系运算(>, ...
- git bash下对文件的操作
window下的e盘中webpack文件夹操作 新建文件夹:mkdir wpdemo: 新建文件:touch index.html; 删除文件夹:rm -r wpdemo; 删除文件:rm index ...