二叉树转双向链表

二叉排序树在不改变BinaryNode<Type>的 struct{data;*left;*right}  情况下是可以转换成双向链表的.

由于二叉树的主要数据都记录在根节点BinaryNode<Type>* root 上的,所以这里就只用BinaryNode类手动建一棵树,

树形如下:

新增的有三个主要函数,

BinaryNode<Type>* GetHead() 是用来查找右子树最小的那个节点

BinaryNode<Type>* GetTail() 是用来查找左子树最大的那个节点

void convert()是转换函数,递归调用

上述两个节点找到之后,分别连上根节点

如图所示:L:left    R:right

这里必须注意的是这里使用了递归修改,所以一定要先进行子节点修改的时候,回溯的时候再修改父节点,不然如果父节点的时候修改了树的结构,那么子节点处理的时候就会出错。我用了recordHead,recordTail来记录当前处理的节点左右子树的尾节点和首节点

时间: 2024-10-31 18:50:06

二叉树转双向链表的相关文章

基于二叉树和双向链表实现限制长度的最优Huffman编码

该代码采用二叉树结合双向链表实现了限制长度的最优Huffman编码,本文代码中的权重全部采用整数值表示.http://pan.baidu.com/s/1mgHn8lq 算法原理详见:A fast algorithm for optimal length-limited Huffman codes.pdf 示例:符号ABCDE的权重分别为10,6,2,1,1 不限制长度的最优Huffman编码为A:0,B:10,C:110,D:1110,E:1111,平均码长为1.8bits/symbol; 限制

算法题——二叉树转换为双向链表

1 BSTreeNode* ConvertNode(BSTreeNode* pNode, bool asRight) 2 { 3 if(!pNode) 4 return NULL; 5 6 BSTreeNode *pLeft = NULL; 7 BSTreeNode *pRight = NULL; 8 9 // Convert the left sub-tree 10 if(pNode->m_pLeft) 11 pLeft = ConvertNode(pNode->m_pLeft, false

算法题:用二叉树构造双向链表

#include <iostream> #include <string.h> using namespace std; struct Node { Node *left;//相当于双向链表的prev指针. Node *right;//相当于双向链表的next指针. char data; Node(char d = char()):data(d),left(NULL),right(NULL){} }; class MTree { public: MTree():root(NULL)

二叉树与双向链表的转换

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析:二叉搜索树要转成有序的链表,可以想到的是利用中序遍历二叉树,每得到一个输出结点就修改其指针指向,从而构成有序链表. 题解: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(N

将一棵二叉树转换为双向链表的俩中算法

要求:输入一棵二叉排序树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的结点,只能调整树中结点的指针的指向.如下图: 方法一:我们借助一个容器来顺序存储结点的指针,然后改变指针的指向. 1 //////////////////////二叉搜索树与双向链表(方法一)////////////////////////////////////////// 2 3 void Convertfirst(BinaryTreeNode* pRoot , vector<BinaryTreeNode*>

二叉树与双向链表问题

做完这道题,我深刻认识到通过边画图边写代码揣摩分析才能真正弄懂这道题,而且如果不是独立思考AC看了题解恐怕就很难弄懂这道题. 这里整理一下题解:本题思路有两种:递归和非递归 Java版AC代码: 数据结构定义: 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val;

二叉搜索树(搜索二叉树)转换成一个双向链表

1.题目描述: 将一个二叉搜索树转换成一个双向链表: 2.二叉搜索树,直接看图: 如图就是一个二叉搜索树的模型,也就是转换函数的入口数据,也是下边函数中即将用到的例子,既然有输入,肯定有输出,先面在看一张图(第三条): 3.输入输出模型: 右边就是最终的输出结果,5后边是空,下边来分析一下: 1.在二叉搜索树中,每个节点都有两个孩子,即左和右,而在双向链表中,每个节点也有两个指针,前驱和后继指针,二叉树和双向链表很有相似性: 2.改变二叉搜索树的左右孩子指针指向,就可完成二叉搜索树到双向链表的转

二叉查找树转换成排序的双向链表

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何 新的结点,只调整指针的指向. 比如将二元查找树 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 思路:对于树的很多题目,都可以使用递归的方法来处理.这道题目也不例外.我们从最基本的思路来考虑这个题目. 把一个二叉树编程双向链表,最终是一个有序的序列,也就是中序遍历之后的结果,那么当我们采用中序遍历的方式遍历二叉树时,遍历到某个节点,是的前序节点的右

基于二叉树和数组实现限制长度的最优Huffman编码

具体介绍详见上篇博客:基于二叉树和双向链表实现限制长度的最优Huffman编码 基于数组和基于链表的实现方式在效率上有明显区别: 编码256个符号,符号权重为1...256,限制长度为16,循环编码1w次,Release模式下.基于链表的耗时为8972ms,基于数组的耗时为1793ms,速度是链表实现方式的5倍. 详细代码例如以下: //Reference:A fast algorithm for optimal length-limited Huffman codes.pdf,http://p