在c语言中,按先序遍历序列建立一个二叉树的二叉链表,统计二叉树中叶子结点个数和二叉树的深度。输入由用户决定
时间: 2023-06-27 19:05:34 浏览: 118
求二叉树的建立、遍历、叶子结点树、深度
5星 · 资源好评率100%
下面是一份C语言代码,可以实现按先序遍历序列建立一个二叉树的二叉链表,统计二叉树中叶子结点个数和二叉树的深度。输入由用户决定。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
// 按先序遍历序列创建二叉树
void CreateBiTree(BiTree *T)
{
char ch;
scanf("%c", &ch);
if (ch == '#') {
*T = NULL;
} else {
*T = (BiTree) malloc(sizeof(BiTNode));
if (!*T) {
exit(-1);
}
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
// 计算二叉树深度
int Depth(BiTree T)
{
if (!T) {
return 0;
}
int lDepth = Depth(T->lchild);
int rDepth = Depth(T->rchild);
return lDepth > rDepth ? lDepth + 1 : rDepth + 1;
}
// 计算叶子结点个数
int CountLeaves(BiTree T)
{
if (!T) {
return 0;
}
if (!T->lchild && !T->rchild) {
return 1;
}
return CountLeaves(T->lchild) + CountLeaves(T->rchild);
}
int main()
{
BiTree T;
printf("请输入先序遍历序列,其中'#'表示空结点:\n");
CreateBiTree(&T);
int depth = Depth(T);
int leaves = CountLeaves(T);
printf("深度为:%d\n", depth);
printf("叶子结点个数为:%d\n", leaves);
return 0;
}
```
在该代码中,我们使用了结构体`BiTNode`来定义二叉树的节点,其中包含了数据`data`和左右子树指针`lchild`和`rchild`。在`CreateBiTree`函数中,我们按照先序遍历的顺序输入每个节点的信息,并递归创建左右子树。在`Depth`函数中,我们递归计算左右子树深度,并返回较大值加1作为整个二叉树的深度。在`CountLeaves`函数中,我们递归计算左右子树叶子结点个数,并将左右子树的叶子结点个数相加得到整个二叉树的叶子结点个数。
阅读全文