/*
* 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;否则在左子树中查找,若在左子树中未找到,再在右子树中查找。