问题:在不创建任何新的节点的情况下,实现将一颗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. POJ 3320_Jessica's Reading Problem

    题意: 每页书都对应一个知识点,问最少看连续的多少页,才能把所有知识点都看完? 分析: <挑战程序设计竞赛>介绍的尺取法,反复推进区间的开头和结尾,来求取满足条件的最小区间,先确定好一个满 ...

  2. jackson的应用

    直接上代码 package com.demo.jackson.utils; import com.fasterxml.jackson.core.JsonProcessingException; imp ...

  3. Ubuntu 16.04安装QtCharts时报错:'qtConfig' is not a recognized test function.

    错误: 'qtConfig' is not a recognized test function. 解决方法: 其实5.9分支的版本有问题,转成5.7分支即可. git clone https://g ...

  4. MySQL JDBC URL参数(转)

    MySQL的 JDBC URL格式: jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=prope ...

  5. 使用百度网盘实现自动备份VPS

    http://ju.outofmemory.cn/entry/51536 经过轰轰烈烈的一轮网盘大战,百度网盘的容量已经接近无限(比如我的是3000多G ),而且百度网盘已经开放API,所以用来备份V ...

  6. IE網址欄快速輸入網址,“Ctrl+Enter”補齊“.com”

    繁體中文Windows,預設 IE 在網址列輸入 abc,然後按 Ctrl+Enter ,會跳到www.abc.com.tw, 但較常用的連結是www.abc.com,如何修改这一設定呢? 可以透過修 ...

  7. apache ab 測试 apr_socket_connect(): 因为目标机器积极拒绝 无法连接

    遇到这样的情况通常是你开的并行数量太多了... 比如:ab -c 1000 -n 10000 http://localhost/index.html 如此大的请求就会挂掉,只是还是有补救措施的,能够通 ...

  8. Linux改动/etc/profile配置错误command is not found自救方法

    我的CSDN博客地址: http://blog.csdn.net/caicongyang 博主之前在改动了/etc/profile配置文件方法后,导致bash命令无法用 运行ls命令结果例如以下: - ...

  9. netty4与protocol buffer结合简易教程

    各项目之间通常使用二进制进行通讯,占用带宽小.处理速度快~ 感谢netty作者Trustin Lee.让netty天生支持protocol buffer. 本实例使用netty4+protobuf-2 ...

  10. 字符串处理(正则表达式、NSScanner扫描、CoreParse解析器)-b

    搜索 在一个字符串中搜索子字符串 最灵活的方法 1 - (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptio ...