第十周--项目3用二叉树遍历思想解决问题(3)(4)

/*         
 * Copyright (c++) 2015 烟台大学计算机学院         
 * All right reserved.         
 * 文件名称:project3.cpp         
 * 作    者: 商文轲         
 * 完成日期:2015年11月6日         
 * 版 本 号:v1.9          
 *         
 
*/            


以下程序均采用多文件组织形式,用到二叉树链式存储算法库btree.b,只将主函数列出

(3)求二叉树b的叶子节点个数

#include <stdio.h>
#include "btree.h"

int LeafNodes(BTNode *b)    //求二叉树b的叶子节点个数
{
    int num1,num2;
    if (b==NULL)
        return 0;
    else if (b->lchild==NULL && b->rchild==NULL)
        return 1;
    else
    {
        num1=LeafNodes(b->lchild);
        num2=LeafNodes(b->rchild);
        return (num1+num2);
    }
}

int main()
{
    BTNode *b;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("二叉树b的叶子节点个数: %d\n",LeafNodes(b));
    DestroyBTNode(b);
    return 0;
}

总结:求叶子结点个数分三种情况:1 树为空,没有叶子节点。

                                                                 2 根节点没有左子树也没有右子树,有唯一结点为叶子节点。

                                                                 3  左右子树存在,叶子节点数=左子树叶子节点数+右子树叶子节点数,利用递归层次深入再返回。

                                                              
(4)设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数。

#include <stdio.h>
#include "btree.h"

int Level(BTNode *b,ElemType x,int h)
{
    int l;// h置初值为1
    if (b==NULL)
        return 0;
    else if (b->data==x)
        return h;
    else
    {
        l=Level(b->lchild,x,h+1);
        if (l==0)
            return Level(b->rchild,x,h+1);
        else
            return l;
    }
}

int main()
{
    BTNode *b;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("值为\'K\'的节点在二叉树中出现在第 %d 层上n",Level(b,'K',1));
    DestroyBTNode(b);
    return 0;
}


 

总结:返回值为所求层次,返回0时表示未找到。h表示b所指结点层次,从根节点开始查找,根节点的层次为1,所以h初值为1。

             如果b为空树,返回0,;如果当前根节点的节点值为x,返回h;否则在左子树中查找,若在左子树中未找到,再在右子树中查找。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值