BST二叉查找树转双向链表DoubleLinke
问题:在不创建任何新的节点的情况下,实现将一颗BST变成有序的双向链表。
分析:
在结构上,如图的一颗BST,每个节点都有left right指针分别指指向左右儿子。结构上和双向链表节点是完全相同的。
在有序上,BST中序遍历的结果刚好是我们想要的双向链表的顺序,那么对于一个节点来说,他的left一定指向双向链表当前
最后一个节点。这样完全可以通过保存当前结果的最后一个节点,来实现双向链表的串联。
具体的,我们可以先找到整棵树的最靠左的节点,作为双向链表的起始点,同时也是初始状态的last_node节点。不断处理lastnode与current node之间的关系并更新last node 即可。
//
// main.cpp
// BSTToList
//
// Created by LiJinxu on 2017/2/26.
// Copyright © 2017年 LiJinxu. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <string> using namespace std; typedef struct TNode {
TNode *left, *right;
int val;
TNode(int v):val(v){}
}*pNode; pNode rt; void createBST(pNode p)
{
string num;
while (cin>>num) {
p = rt;
if(num != "#"){
pNode newNode = new TNode(atoi(num.c_str()));
if(p == NULL){
rt = newNode;
}else{
int n = atoi(num.c_str());
while (p){
if(n > p -> val){
if(p -> right == NULL){
p -> right = newNode;
break;
}
else
p = p -> right;
}else{
if(p -> left == NULL){
p -> left = newNode;
break;
}
else
p = p -> left;
}
}
}
}else{
break;
}
}
} void travelBST(pNode p)
{
if(p){
travelBST(p -> left);
cout<<"node: "<<p->val<<endl;
travelBST(p -> right);
}
} pNode lastNode;
pNode lBeginNode; pNode findTheLeftNode(pNode p)
{
if(p){
if(p -> left == NULL) return p;
else return findTheLeftNode(p -> left);
}
return NULL;
} void convert(pNode p)
{
if (p) {
convert(p -> left);
if(lastNode != p){
p -> left = lastNode;
lastNode -> right = p;
lastNode = p;
}else{
p -> left = NULL;
}
convert(p -> right); }
} void dispDLink(pNode p){
p = lBeginNode;
pNode lEndNode = NULL;
cout<<"From left to right: "<<endl;
while (p) {
cout<<p->val<<" ";
if(p -> right == NULL) lEndNode = p;
p = p -> right;
}
cout<<endl<<"end node: "<<lEndNode->val<<endl;
p = lEndNode;
cout<<"From right to left: "<<endl;
while (p) {
cout<<p->val<<" ";
p = p -> left;
}
} void solve(pNode rt)
{
lBeginNode = findTheLeftNode(rt);
lastNode = lBeginNode;
convert(rt);
cout<<"begin node: "<<lBeginNode->val<<endl;
dispDLink(lBeginNode);
} int main(int argc, const char * argv[]) {
createBST(rt);
//travelBST(rt);
solve(rt);
return ;
}
BST二叉查找树转双向链表DoubleLinke的更多相关文章
- 数据结构学习-BST二叉查找树 : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图
二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ...
- 【算法Everyday】第一日 二叉查找树转双向链表
算法题目链接:http://bbs.csdn.net/topics/350093707 题目 // 1.把二元查找树转变成排序的双向链表 // 题目: // 输入一棵二元查找树,将该二元查找树转换成一 ...
- C++数据结构之二叉查找树(BST)
C++数据结构之二叉查找树(BST) 二分查找法在算法家族大类中属于“分治法”,二分查找的过程比较简单,代码见我的另一篇日志,戳这里!因二分查找所涉及的有序表是一个向量,若有插入和删除结点的操作,则维 ...
- [学习笔记] 二叉查找树/BST
平衡树前传之BST 二叉查找树(\(BST\)),是一个类似于堆的数据结构, 并且,它也是平衡树的基础. 因此,让我们来了解一下二叉查找树吧. (其实本篇是作为放在平衡树前的前置知识的,但为了避免重复 ...
- BST树
http://www.cnblogs.com/bizhu/archive/2012/08/19/2646328.html 4. 二叉查找树(BST) Technorati 标记: 二叉查找树,BST, ...
- 纯数据结构Java实现(4/11)(BST)
个人感觉,BST(二叉查找树)应该是众多常见树的爸爸,而不是弟弟,尽管相比较而言,它比较简单. 二叉树基础 理论定义,代码定义,满,完全等定义 不同于线性结构,树结构用于存储的话,通常操作效率更高.就 ...
- JS高级-数据结构的封装
最近在看了<数据结构与算法JavaScript描述>这本书,对大学里学的数据结构做了一次复习(其实差不多忘干净了,哈哈).如果能将这些知识捡起来,融入到实际工作当中,估计编码水平将是一次质 ...
- 游戏引擎架构 (Jason Gregory 著)
第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...
- Convert Sorted Array to Binary Search Tree
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
随机推荐
- 洛谷 P1555 尴尬的数字
P1555 尴尬的数字 题目背景 Bessie刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔. 题目描述 每当Bessie将一个数转换成新的进制时,她总会写错一位 ...
- Ubuntu 16.04安装磁盘占用分析器:ncdu
使用此工具能分析出哪个文件或者文件夹有多大,从而实现自己手动删除. 安装: sudo apt-get install ncdu 使用: #默认搜索当前用户目录 ncdu #搜索整个硬盘 ncdu /
- HTML学习之Flex 布局
一.Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 Flex 布局. .box ...
- golang 中可变参数的个数
package main import "fmt" func Greeting(prefix string, who ... string) { fmt.Println(prefi ...
- Linux挂载新盘
Linux 系统挂载数据盘 1.查看数据盘 使用“fdisk-l”命令查看 2. 对数据盘进行分区 执行“fdisk /dev/sdb”命令,对数据盘进行分区: 输入“n”,“p”“1”,两次回车,“ ...
- HDU 2870 Largest Submatrix (单调栈)
http://acm.hdu.edu.cn/showproblem.php? pid=2870 Largest Submatrix Time Limit: 2000/1000 MS (Java/Oth ...
- SDK Manager配置
改Host的都是扯淡,现在不好使了.. 还是使用东软的国内镜像好使,打开SDK Manager Tools - Options Http proxy Server: mirrors.neusoft. ...
- lvm调整分区大小
1 问题 /home分区占用空间比较大,而/var分区比较小,它们位于同一个磁盘上.该系统安装了lvm. 2 减少/home分区空间 2.1 卸载/home umount /home 2.2 检查文件 ...
- mySQL (关系型数据库管理系统)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...
- 【POI2004】【Bzoj2069】T2 洞穴 zaw
T2 洞穴zaw [问题描述] 在 Byte 山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是 1 号点.两个洞室要么就通过隧道连接起来,要么就经过若干隧道间接的相连. ...