在二叉树中,每个结点都有两个指向子结点的指针. 在双向链表中, 每个结点也有两个指针,它们分别指向前一个结点和后一个结点.由于这两种结构的相似性, 同时二叉搜索树也是一种排过序的数据结构, 因此在理论上有可能实现二叉搜索树和排序的双向链表之间的转换.

下面的文件BST_to_DL.cpp将BST转换为排序过的双向链表,请参加代码:

#include "binary_tree.h"void ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList){if(pNode == NULL)return;BinaryTreeNode* pCurrent = pNode;//首先处理左子树if(pCurrent->pLeft)ConvertNode(pNode->pLeft, pLastNodeInList);//完成pCurrent与pLastNodeInList的拼接和更替pCurrent->pLeft = *pLastNodeInList;if(*pLastNodeInList != NULL)(*pLastNodeInList)->pRight = pCurrent;*pLastNodeInList = pCurrent;//遍历到右子树if(pCurrent->pRight)ConvertNode(pCurrent->pRight,pLastNodeInList);
}BinaryTreeNode* Convert(BinaryTreeNode* pRoot){BinaryTreeNode* pLastNodeInList = NULL;ConvertNode(pRoot, &pLastNodeInList);//pLastNodeInList指向双向链表的尾结点,我们逆序返回它的头结点BinaryTreeNode* pHeadOfList = pLastNodeInList;while(pHeadOfList != NULL && pHeadOfList->pLeft != NULL)pHeadOfList = pHeadOfList->pLeft;return pHeadOfList;
}//========================测试代码 =============================
void PrintDoubleLinkedList(BinaryTreeNode* pHeadOfList){BinaryTreeNode* pNode = pHeadOfList;printf("The nodes from left to right are:\n");while(pNode != NULL){printf("%d\t", pNode->value);if(pNode->pRight == NULL)break;pNode = pNode->pRight;}printf("\nThe nodes from right to left are:\n");while(pNode != NULL){printf("%d\t", pNode->value);if(pNode->pLeft == NULL)break;pNode = pNode->pLeft;}printf("\n");
}void DestroyList(BinaryTreeNode* pHeadOfList){BinaryTreeNode* pNode = pHeadOfList;while(pNode != NULL){BinaryTreeNode* pNext = pNode->pRight;delete pNode;pNode = pNext;}
}void Test(const char* testName, BinaryTreeNode* pRoot){if(testName != NULL)printf("%s  begins: \n", testName);PrintTree(pRoot);BinaryTreeNode* pHeadOfList = Convert(pRoot);PrintDoubleLinkedList(pHeadOfList);
}//                            10
//                           /  \
//                          6    14
//                         /\    /\
//                        4  8  12 16
void Test1(){BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode14 = CreateBinaryTreeNode(14);BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);BinaryTreeNode* pNode16 = CreateBinaryTreeNode(16);ConnectTreeNodes(pNode10, pNode6, pNode14);ConnectTreeNodes(pNode6, pNode4, pNode8);ConnectTreeNodes(pNode14, pNode12, pNode16);Test("Test1", pNode10);DestroyList(pNode4);
}//                       5
//                      /
//                     4
//                    /
//                   3
//                  /
//                 2
//                /
//               1
void Test2(){BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);ConnectTreeNodes(pNode5, pNode4, NULL);ConnectTreeNodes(pNode4, pNode3, NULL);ConnectTreeNodes(pNode3, pNode2, NULL);ConnectTreeNodes(pNode2, pNode1, NULL);Test("Test2", pNode5);DestroyList(pNode1);
}// 1
//  \
//   2
//    \
//     3
//      \
//       4
//        \
//         5
void Test3(){BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);ConnectTreeNodes(pNode1,NULL,pNode2);ConnectTreeNodes(pNode2,NULL,pNode3);ConnectTreeNodes(pNode3,NULL,pNode4);ConnectTreeNodes(pNode4,NULL,pNode5);Test("Test3",pNode1);DestroyList(pNode1);
}//树中只有1个结点
void Test4(){BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);Test("Test4", pNode1);DestroyList(pNode1);
}//树中没有结点
void Test5(){Test("Test5",NULL);
}int main(int argc, char** argv){Test1();Test2();Test3();Test4();Test5();return 0;
}

将BST转换为有序的双向链表!相关推荐

  1. 将二叉搜索树转换为有序的双向链表

    题目:给出一个二叉搜索树,要求将它转换为有序的双向链表,要求不能添加新的节点空间. 思路:有序的双向链表,二叉搜索树的中序遍历是有序的. 递归: public class TreeNodeDemo { ...

  2. ( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】

    二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 , ...

  3. 二叉查找树转换成有序的双向链表

    首先对于二叉查找树的定义和性质,以及如何得到二叉查找树某个节点的子树下的最大值和最小值和插入一个值的内容可以参考这两篇文章: (1)http://www.cnblogs.com/chenping-98 ...

  4. Solution 1: BST转双向链表

    问题描述 将一棵二叉查找树(BST)转为有序的双向链表. 例如,有一颗BST如下: 2 |  \ 1    3 转成双向链表为: 1=2=3 解决思路 1. 保持有序:中序遍历: 2. 双向链表:记录 ...

  5. 九月十月百度,迅雷,华为,阿里巴巴,最新校招笔试面试六十题

    九月迅雷,华为,阿里巴巴,最新笔试面试十题 8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的     i .每次从通里面 ...

  6. 最新校招笔试面试六十题

    原文: 九月十月百度,迅雷,华为,阿里巴巴最新校招笔试面试六十题(11.05) 链接:http://blog.csdn.net/v_july_v/article/details/11921021 分类 ...

  7. 2014九月十月百度,迅雷,华为,阿里巴巴,最新校招笔试面试题

    九月十月百度,迅雷,华为,阿里巴巴,最新校招笔试面试六十题 题记 本博客自2010年10月11日开通以来,已经帮助了一大批人找到工作,特别是连续三年在每一年的9.10月份陪伴了至少三届毕业生找工作的旅 ...

  8. 九月十月百度,迅雷,华为,阿里巴巴,最新校招笔试面试五十题

    题记 本博客自2010年10月11日开通以来,已经帮助了一大批人找到工作,特别是连续三年在每一年的9.10月份陪伴了至少三届毕业生找工作的旅程,包括校招中的笔试面试,今年也不会例外,我会在本博客开通3 ...

  9. 视频教程-Python数据结构与算法面试(上)-Python

    Python数据结构与算法面试(上) 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN学院专家讲师,制作视频课程超过1 ...

最新文章

  1. Redhat7开机图形或文字界面
  2. 算法训练 连续正整数的和 (枚举)
  3. 微信开放平台,微信登陆第三方网站 提示redirect_uri 参数错误
  4. Linux命令之ifconfig
  5. KindEditor编辑器, 利用ajax动态切换编辑器内容
  6. Goroutine Local Storage的一些实现方案和必要性讨论
  7. 判断端口是否能用_扫描器篇(八)之python+scapy构造TCP协议包扫描主机端口
  8. android view stop,android – onDestroyView片段永远不会在onStop之后调用
  9. android sdk 8.1.0,OneAPM版本更新:Android SDK 1.0.8
  10. sun.misc jar包
  11. Hive(二)——数据类型与文件格式
  12. 基于lis3dh的简易倾角仪c源码_cm-23D柯尼卡美能达分光测色计色差仪CM-2300d
  13. 我推荐的一些C\C++书籍
  14. android rom制作教程,【图片】ROM助手:任意安卓机型的ROM制作教程【a298t吧】_百度贴吧...
  15. jdk动态代理使用详解
  16. 日常搜集的勒索病毒解密工具的汇总
  17. VRay Next(4.0) for SketchUp之BIG分析图制作教程
  18. java action例子_实例——创建ActionForm Bean
  19. 彻底理解原型对象与原型链机制
  20. 日语中特殊汉字「髙」写入文件后乱码

热门文章

  1. RabbitMQ 入门系列(10)— RabbitMQ 消息持久化、不丢失消息
  2. 个人作业1——四则运算题目生成程序
  3. ATL的GUI程序设计(3)
  4. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
  5. 双击进入物料数据的指定视图
  6. NuGet学习笔记(3) 搭建属于自己的NuGet服务器
  7. Boost 1.53.0 发布,可移植的C++标准库
  8. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)
  9. EntityCURD操作的参数和返回值
  10. python类的成员函数_python特殊成员函数