问题:在不创建任何新的节点的情况下,实现将一颗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的更多相关文章

  1. 数据结构学习-BST二叉查找树 : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图

    二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ...

  2. 【算法Everyday】第一日 二叉查找树转双向链表

    算法题目链接:http://bbs.csdn.net/topics/350093707 题目 // 1.把二元查找树转变成排序的双向链表 // 题目: // 输入一棵二元查找树,将该二元查找树转换成一 ...

  3. C++数据结构之二叉查找树(BST)

    C++数据结构之二叉查找树(BST) 二分查找法在算法家族大类中属于“分治法”,二分查找的过程比较简单,代码见我的另一篇日志,戳这里!因二分查找所涉及的有序表是一个向量,若有插入和删除结点的操作,则维 ...

  4. [学习笔记] 二叉查找树/BST

    平衡树前传之BST 二叉查找树(\(BST\)),是一个类似于堆的数据结构, 并且,它也是平衡树的基础. 因此,让我们来了解一下二叉查找树吧. (其实本篇是作为放在平衡树前的前置知识的,但为了避免重复 ...

  5. BST树

    http://www.cnblogs.com/bizhu/archive/2012/08/19/2646328.html 4. 二叉查找树(BST) Technorati 标记: 二叉查找树,BST, ...

  6. 纯数据结构Java实现(4/11)(BST)

    个人感觉,BST(二叉查找树)应该是众多常见树的爸爸,而不是弟弟,尽管相比较而言,它比较简单. 二叉树基础 理论定义,代码定义,满,完全等定义 不同于线性结构,树结构用于存储的话,通常操作效率更高.就 ...

  7. JS高级-数据结构的封装

    最近在看了<数据结构与算法JavaScript描述>这本书,对大学里学的数据结构做了一次复习(其实差不多忘干净了,哈哈).如果能将这些知识捡起来,融入到实际工作当中,估计编码水平将是一次质 ...

  8. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

  9. Convert Sorted Array to Binary Search Tree

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

随机推荐

  1. P1160 队列安排 洛谷

    https://www.luogu.org/problem/show?pid=1160 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进 ...

  2. HDU——2647 Reward

    Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. MongoDB学习day01--非关系型数据库

    1.数据库和文件的主要区别: 1.1数据库有数据库表/行和列的概念,让我们存储操作数据方便 1.2数据库提供了方便的接口,让java.php..net.nodejs很方便的实现增删改查 2.NoSQL ...

  4. Spring在Java Filter注入Bean为Null的问题解决

    在Spring的自动注入中普通的POJO类都可以使用@Autowired进行自动注入,但是除了两类:Filter和Servlet无法使用自动注入属性.(因为这两个归Web容器管理)可以用init(集承 ...

  5. Spring Boot实现多个数据源教程收集(待实践)

    先收集,后续实践. http://blog.csdn.net/catoop/article/details/50575038 http://blog.csdn.net/neosmith/article ...

  6. NTKO在线office控件使用实例

    目录 1. NTKO在线office控件使用实例 1.1. 基础介绍 1.2. 基本原理 1.3. 实例 1.3.1. 打开.保存部分代码 1.3.2. 动态设值 1. NTKO在线office控件使 ...

  7. Base Conversion In PHP and javascript

    http://www.exploringbinary.com/base-conversion-in-php-using-built-in-functions/ http://www.binarycon ...

  8. Objective-C之成魔之路【8-訪问成员变量和属性】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 訪问成员变 ...

  9. sharepoint 訪问缩略图

    Sharepoint缩略图 简单介绍 Sharepoint2010中有专门的图片库,当你新建图片库后,向图片上传一部分图片.当你浏览这个库时显示一排排小图片.当点击一个图片时进入显示的是大图.不要简单 ...

  10. c#如何设置成:【当前打开的项目是什么,就默认它为启动项目】,不然新添或打开别的项目都要设置一次启动 [原创]VS2012中将当前选定项目做为启动项

    主菜单→[工具]→[选项]→[项目和解决方案]→[生成并运行],选中“对于新解决方案,使用当前选定的项目作为启动项目” 应该是右键单击解决方案,点击属性打开,选中“当前选定内容”那一项,就可以把你正在 ...