问题及代码:
/*
*烟台大学计算机与控制工程学院
*作 者:孙丽玮
*完成日期:2016年11月3日
*问题描述:假设二叉树采用二叉链存储结构存储,分别实现以下算法,并在程序中完成测试:
(1)计算二叉树节点个数
(2)输出所有叶子节点
(3)求二叉树b的叶子节点个数
(4)设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数。
*/
1、btree.h的代码(见二叉树算法库)
2、btree.cpp的代码(见二叉树算法库)
3、main.cpp的代码
#include <stdio.h>
#include "btree.h"
//计算二叉树节点个数
int Nodes(BTNode *b)
{
if(b==NULL)
return 0;
else
return Nodes(b->lchild)+Nodes(b->rchild)+1;
}
//输出所有叶子节点
void DispLeaf(BTNode *b)
{
if(b!=NULL)
{
if(b->lchild==NULL && b->rchild==NULL)
printf("%c",b->data);
DispLeaf(b->lchild);
DispLeaf(b->rchild);
}
}
//求二叉树b的叶子节点个数
int LeafNodes(BTNode *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);
}
}
//设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数
int Level(BTNode *b,ElemType x,int h)
{
int l;
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,F(K,I)),C(E(H,J),G))");
printf("(1)二叉树节点个数: %d\n", Nodes(b));
printf("(2)二叉树所有叶子节点是:");
DispLeaf(b);
printf("\n");
printf("(3)二叉树的叶子节点个数:%d\n",LeafNodes(b));
printf("(4)值为\'K\'的节点在二叉树中出现在第 %d 层上\n",Level(b,'K',1));
DestroyBTNode(b);
return 0;
}
运行结果:
总结:
正确运用二叉树的性质及三种遍历方法。