数据结构与算法(九)二叉树遍历算法应用&线索二叉树

二叉树链表的建立(先序遍历序列建立二叉树链表)

        获取结点信息;按照二叉树先序方式建立

         需要读入空结点信息:#        先序序列ABCDEF

                                                       读入先序ABC##DE#G##F###

Status CreateBiTree(BiTree &T){
    cin>>ch;
    if(ch == "#")  T=NULL;
    else{
        if(!T = new BiTNode())
        exit(OVERFLOW);
        T->data = ch;//生成根结点
        CreateBiTree(T->lchild);//生成左子树
        CreateBiTree(T->rchild);//生成右子树
    }
    return OK;
}

复制二叉树(先序遍历)

int Copy(BiTree T,BiTree &NewT){
    if(T == NULL){
        NewT=NULL; return 0;//源树为空树
    }
    else{
        NewT = new BiTNode;    NewT->data=T->data;
        Copy(T->lchild,NewT->lchild);
        Copy(T->rchild,NewT->rchild);
    }
}

深度计算

        递归左子树深度记作m,右子树深度记作n,对比两者中最大的值然后+1

int Depth(BiTree T){
    if(T == NULL) return 0;//空树
    else{
        m=Depth(T->lchild);
        n=Depth(T->rchild);
        ///递归计算深度↑

        //判断谁大↓
        if(m>n) return(m+1);
        else
            return (n+1);
    }
}

结点总数计算

        左子树结点+右子树结点+1

int NodeCount(BiTree T){
    if(T == NULL)
        return 0;
    else
        return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

统计叶子结点个数

int LeadCount(BiTree T){
    if(T==NULL)
        return 0;
    if(T->lchild == NULL && T->rchild==NULL)
        return 1;
    else
        return LeadCount(T->lchild) + LeadCount(T->rchild);
}

线索二叉树

        利用二叉树中的空指针域(遍历特殊的前驱和后继)

        如果左孩子为空则将其改为指向前驱,如果右孩子为空则将其改为指向后继

        此过程称为线索化

        在结点中增设两个标志域ltagrtag

                ltag=0        lchild指向左孩子

                ltag=1        lchild指向前驱

                rtag=0        rchild指向右孩子

                rtag=1        rchild指向后继

         增加一个头结点,避免最后的结点悬空(遍历的第一个结点的lc和最后一个结点的rc都指向头结点)

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值