关于线索二叉树恢复成正常二叉树

来源:互联网 发布:网络流行语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;
}


原创粉丝点击