今天想来这里分享一下自己的代码。
在做数据结构的课程设计的时候,文档上面有要求删除结点以及左右子树的功能。然而在之前的设计中,我已经将二叉树遍历设计成前序线索二叉树遍历的代码了。所以,要想删除节点必须利用线索二叉树删除结点。然而感觉工程量过大(其实是没时间设计了),只能将线索二叉树恢复成正常二叉树,然后再进行采用递归的算法删除二叉树结点(虽然有点麻烦但还是只能采用这种尴尬的操作)。
然而在上网查询代码的时候(程序员标配,上网搜索),却没有发现有关线索二叉树恢复的代码(其实在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;
}