树和二叉树(基础篇)

6-1统计二叉树节点个数


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

6-2统计二叉树叶子结点个数

 

int LeafCount ( BiTree T)

{

    int sum=0;

    if(!T) return 0;

    else if(!T->lchild&&!T->rchild) sum+=1;

    else return LeafCount(T->lchild)+LeafCount(T->rchild);

    return sum;

}

6-3统计二叉树度为1的结点个数


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

6-4统计二叉树度为2的结点个数

 

int NodeCount ( BiTree T)

{

    if(!T) return 0;

    if(T->lchild!=NULL&&T->rchild!=NULL){

        return 1+NodeCount(T->lchild)+NodeCount(T->rchild);

    }

    return NodeCount(T->lchild)+NodeCount(T->rchild);

}

6-5求二叉树的深度

 

int Depth(BiTree T)

{

    if(!T) return 0;

    else if(Depth(T->lchild)>=Depth(T->rchild))

        return Depth(T->lchild)+1;

    else return Depth(T->rchild)+1;

}

6-6先序输出叶结点

void PreorderPrintLeaves( BinTree BT )

{

    if(BT) 

    {

        if(BT->Left==NULL&&BT->Right==NULL) printf(" %c",BT->Data);

        PreorderPrintLeaves(BT->Left);

        PreorderPrintLeaves(BT->Right);

    }

}

6-7二叉树的三种遍历

//空树 空操作

//不空 DLR输出根,左 右

void Preorder(BiTree T)

{

    if(T)

    {

        printf(" %c",T->data);

        Preorder(T->lchild);

        Preorder(T->rchild);

    }

}

void Inorder(BiTree T)

{

    if(T)

    {

 

        Inorder(T->lchild);

        printf(" %c",T->data);

        Inorder(T->rchild);

    }

}

void Postorder(BiTree T)

{

    if(T)

    {

        

        Postorder(T->lchild);

        Postorder(T->rchild);

        printf(" %c",T->data);

    }

}

6-8后缀表达式

void Suffix(BiTree T)

{

    if(T)

    {

        Suffix(T->lchild);

        Suffix(T->rchild);

        printf("%c ",T->data);

    }

}

6-9二叉树的层次遍历

 

void Levelorder(BiTree T)

{

    BiTree q[1000];

    int f=0,r=0;

    if(T) q[r++]=T;

    while(f!=r)

    {

        BiTree p=q[f++];

        printf(" %c",p->data);

        if(p->lchild) q[r++]=p->lchild;

        if(p->rchild) q[r++]=p->rchild;

    }

    

}

6-10打印二叉树指定层次结点

 

void PrintLevel(BiTree T,int n)

{

    if(T)

    {

        if(n==1) printf("%c ",T->data);

        PrintLevel(T->lchild,n-1);

        PrintLevel(T->rchild,n-1);

    }

}

6-11层次输出n个结点

 

void PrintNode(BiTree T,int n)

{

    BiTree q[1000];

    int f=0,r=0;

    if(T) q[r++]=T;

    int cnt=0;

    while(f!=r)

    {

        BiTree p=q[f++];

        cnt++;

        if(cnt==n) 

        {

            printf("%c",p->data);

            return;

        }

        if(p->lchild) q[r++]=p->lchild;

        if(p->rchild) q[r++]=p->rchild;

    }

}

 6-12从下往上打印指定元素的所有祖先

int PrintAncestors(BiTree T,char ch)
{
    int c1,c2;
    if(T==NULL)return 0;//空树
    else if(T->data==ch)
            return 1;//找到ch的祖先,返回1
    else
    {
      c1=PrintAncestors(T->lchild,ch);//递归查找子孙为ch的节点
      c2=PrintAncestors(T->rchild,ch);
        if(c1||c2)//返回1时
            printf("%c ",T->data);//打印
    }
}
 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值