一、实验目的
假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。 试设计一个算法,采用先序遍历方式求一棵给定二叉树b中的所有大于x 的结点个数;并用相关数据进行测试。
二、实验内容
1. 实现一个二叉树的创建函数`CreateBTree`。
2. 实现二叉树的销毁函数`DestroyBTree`。
3. 编写先序遍历二叉树的函数`DispBTree`。
4. 实现计算二叉树高度的函数`BTHeight`。
5. 实现求二叉树结点总数的函数`NodeCount`。
6. 实现求二叉树叶子结点总数的函数`LeafCount`。
7. 编写求二叉树中所有大于x的结点个数的函数`GreaterNodes`。
8. 测试以上功能,验证结果的正确性。
三、实验过程
实现思路:
创建二叉树:使用字符串输入构造二叉树,左括号表示进入左子树,右括号表示进入右子树,逗号分隔兄弟节点。
销毁二叉树:采用后序遍历方式释放二叉树内存。
先序遍历输出:按先序遍历顺序打印二叉树结构。
求二叉树高度:递归计算左右子树高度,返回较大者加一。
求结点总数:递归计算左右子树结点数并加上根结点。
求叶子结点总数:若当前结点为叶子结点(无左右孩子),则计数加一,否则递归计算左右子树的叶子结点数。
求大于x的结点个数:递归遍历二叉树,若当前结点值大于x,则计数加一,并继续递归左右子树。
#include "BTree.cpp"
int GreaterNodes(BTNode *b, char x)
{
int num1, num2, num=0;
if (b==NULL)
return 0;
else
{ if (b-> data> x)num++;
num1=GreaterNodes(b->lchild, x);
num2=GreaterNodes(b->rchild,x);
num+=num1+num2;
return num;
}
}
int main()
{
BTNode *bt;
CreateBTree(bt,"A(B(D,E(G,H)),C(,F(I)))");
printf("bt: ");
DispBTree(bt);
printf("\n");
char x;
x='C';
int n=GreaterNodes(bt, x);
printf("bt 中大于%c的结点个数=%d\n",x,n);
DestroyBTree(bt);
}
实验结果/运行图: