关于线索二叉树恢复成正常二叉树
来源:互联网 发布:网络流行语mgt什么意思 编辑:程序博客网 时间:2024/05/22 03:51
今天想来这里分享一下自己的代码。
在做数据结构的课程设计的时候,文档上面有要求删除结点以及左右子树的功能。然而在之前的设计中,我已经将二叉树遍历设计成前序线索二叉树遍历的代码了。所以,要想删除节点必须利用线索二叉树删除结点。然而感觉工程量过大(其实是没时间设计了),只能将线索二叉树恢复成正常二叉树,然后再进行采用递归的算法删除二叉树结点(虽然有点麻烦但还是只能采用这种尴尬的操作)。
然而在上网查询代码的时候(程序员标配,上网搜索),却没有发现有关线索二叉树恢复的代码(其实在CSDN上有代码但是要求下载TAT),所以自己憋了一个晚上写出来了
本人用的是前序遍历线索二叉树。
虽然没有多难但是还是个人心血(大二狗),下面就是前序遍历线索二叉树的代码:
void PreorderTraver(BiThrNode *(&T1))//前序遍历线索二叉树
{
BiThrNode *b = new BiThrNode;
b = T1->lchild;
while(b!= T1)
{
cout<<b->data<<' ';
if(0 == b->LTag)
b = b->lchild;//当有左孩子就继续往下遍历
else
b = b->rchild;//没有就靠右孩子找后继结点
}
}
恢复原有二叉树的算法思想其实很简单:利用前序遍历线索二叉树的思想,在遍历的时候,碰到左孩子和右孩子不存在的情况,将指向左孩子和右孩子的指针设为空值。
以下是代码:
void RecoverTree(BiThrNode *(&T1))//从线索二叉树回复原有二叉树
{
BiThrNode *b = new BiThrNode;//这个指针用来被头指针的左孩子指向
BiThrNode *b1 = new BiThrNode;//该结点用来检测,一旦左孩子或者右孩子出现不存在的情况,在b遍历到后继结点过后,用来改正指针的值
b = T1->lchild;//头结点的左孩子指向二叉树的根结点
while(b!= T1)
{
if(0 == b->LTag)
{
b = b->lchild;
}
else
{
b1 = b;//此时预留下b结点的值,让b继续往下遍历
b = b->rchild;
b1->lchild = NULL;//此时左孩子的LTag为1,说明没有左孩子,所以将左孩子的值赋值为空
if(b1->RTag == 1)//检测是否有右孩子
b1->rchild = NULL;
}
}
T1 = T1->lchild;
}
- 关于线索二叉树恢复成正常二叉树
- 线索二叉树 --->树
- 线索二叉树算法
- C#线索二叉树
- 线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树
- 线索化二叉树
- 线索二叉树
- C#线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树实例
- 线索二叉树
- 线索二叉树算法
- C++线索二叉树
- 线索二叉树
- fresco加载图片+EventBus Activity之间跳转传值+GreenDAo数据库+retrofit请求数据+recyclerview展示数据+ButterKnife找控件
- Aerospike 的索引内存管理--as_index->dim
- 索引查找(分块查找)
- 3
- 第一周 枚举 例题4.称硬币 [POJ1013]
- 关于线索二叉树恢复成正常二叉树
- C#实现自动升级(附源码)
- 图像连通域分析(Two-Pass & DFS )
- codeforces 894C
- Aerospike的bin内存管理--即列内存管理
- Linux 静态库使用
- 123. Best Time to Buy and Sell Stock III
- char *s=“hello” 和 char s[]=“hello”的 区别
- 洛谷p1135 奇怪的电梯