二叉树转双向链表问题

博客围绕将二元查找树转换成排序双向链表的问题展开,要求不创建新结点,仅调整指针指向。还对比了该转换与二叉树线索化的区别,包括双向链表的理解和构建过程,并提及会贴出两者代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题由来:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

10

/ /

6  14

/ / / /

4  8 12 16

转换成双向链表

4=6=8=10=12=14=16。

————————————————————————————————————————————————————————

查询了一些资料,有人说这问题就是二叉树的线索化过程。这里我个人觉得不是。理由如下:

1、线索二叉树中,确实其中存在的是双向线索链表,理解为一种需要简单处理的双向线索链表;(如:当右指针为线索时,直接继承后继,如果右指针为子树时,需要递归找寻右子树的最左边子节点的处理)

2、双向链表,理解为直接继承后继,一直到链表为空。简单的后继后继就成的。

3、构建过程也不一样:

(3.1 )二叉树线索化的思想: 保存两个关键的指针:pre指针(上一次访问的指针)和current指针;当current->lchild为空时,current->lchild = pre; 当pre ->rchild为空时,pre->rchild = current; 然后,执行pre = current;当中序遍历结束时,二叉搜索树也被线索化了。

(3.2 )二叉树转换为双向链表的思想: 保存两个关键的指针:pre指针(上一次访问的指针)和T指针;对于每一个节点,执行T->lchild = prepre;pre->rchild = T; 然后执行pre = T;当中序遍历结束时,二叉搜索树也被转化为双链表了。

————————————————————————————————————————————————————————

下面贴出两者的代码 

 1 void BiTreeToLinklist(BiTree &T)  // change tree to linklist
 2 {
 3     if(T != NULL) // 双向链表化
 4     {
 5         BiTreeToLinklist(T->lchild);
 6         T->lchild = pre;
 7         pre->rchild = T;
 8         pre = T;
 9         BiTreeToLinklist(T->rchild);
10     }
11 }

转载于:https://www.cnblogs.com/xuxu8511/archive/2012/03/20/2407528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值