20

本文详细介绍了二叉树遍历算法的应用,包括统计叶子节点个数、求树深度、复制树和根据先序序列建立二叉树等实例。重点展示了通过先序、后序遍历实现不同功能的代码逻辑。

严蔚敏视频 笔记20

遍历算法的应用举例

1.统计二叉树中叶子结点的个数(先序遍历)
void CountLeaf(BiTree T,int &count) {
    if(T) {
        if((!T->lchild)&&(!T->rchild)) count++;
        CountLeaf(T->lchild,count);
        CountLeaf(T->rchild,count);
    }
}

2.求二叉树的深度(后序遍历)
int Depth(BiTree T) {
    if(!T) depthval=0;
    else {
        depthLeft=Depth(T->lchild);
        depthRight=Depth(T->rchild);
        depthval=1+(depthLeft>depthRight)?depthLeft:depthRight;
    }
    return depthval;
}

3.复制二叉树(后序遍历)
//
生成一个二叉树的结点
BiTNode * GetTreeNode(TElemType item,BiTNode *lptr,BiTNode *rptr) {
    if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
        exit(1);
    T->data=item;
    T->lchild=lptr;
    T->rchild=rptr;
    return T;
}

BiTNode * CopyTree(BiTNode *T) {
    if(!T) return NULL;
    if(T->lchild) newlptr=CopyTree(T->lchild);
    else newlptr=NULL;
    if(T->rchild) newrptr=CopyTree(T->rchild);
    else newrptr=NULL;
    newnode=GetTreeNode(T->data,newlptr,newrptr);
    return newnode;
}

4.建立二叉树的存储结构
按给定的先序序列建立二叉链表
Status CreateBiTree(BiTree &T) {
    scanf(&ch);
    if(ch==' ') T=NULL;
    else {
        if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
        T->data=ch; //
生成根结点
        CreateBiTree(T->lchild); //
构造左子树
        CreateBiTree(T->lchild); //
构造右子树
    }
    return OK;
}
空格代表空树

按给定的表达式建立二叉树
由先缀表达式建树

void CrtExptree(BiTree &T,char exp[]) {
    InitStack(S); Push(S,"#"); InitStack(PTR);
    p=exp; ch=*p;
    while(!(GetTop(S)=='#'&&ch=='#')) {
        if(!IN(ch,OP)) CrtNode(t,ch); //
建立叶子结点并入栈

        else {
            switch(ch) {
            case '(': Push(S,ch); break;
            case ')':
            {
                Pop(S, c);
                while (c!='(' ) {
                    CrtSubtree(t,c); Pop(S,c);
                }
                break;
            }
            default:
            {
                while(!Gettop(S,c)&&(precede(c,ch))) {
                    CrtSubtree(t,c); Pop(S,c);
                }
                if ( ch!='#') Push(S,ch);
                break;
            }
            }
        }
        if(ch!='#') { p++; ch=*p;}
    }
    Pop(PTR,T);
}

建立叶子结点的算法
void CrtNode(BiTree &T,char ch) {
    T=(BiTNode *)malloc(sizeof(BiTNode));
    T->data=ch;
    T->lchild=T->T-rchild=NULL;
    Push(PTR,T);
}

建立子树的算法
void CrtSubtree(BiTree &T,char ch) {
    T=(BiTNode *)malloc(sizeof(BiTNode));
    T->data=ch;
    Pop(PTR,rc); T->rchild=rc;
    Pop(PTR,lc); T->lchild=lc;
    Push(PTR,T);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值