用数据结构c语言编程,构造二叉链表存储二叉树T,三种方式递归遍历T,递归计算T的深度,递归统计T中结点的个数,递归统计T中叶子结点的个数
时间: 2023-06-03 20:05:25 浏览: 114
好的,这是一个关于数据结构的问题,我可以回答。首先,构造二叉链表存储二叉树T可以采用C语言中的结构体来实现。然后,三种方式递归遍历T可以分别采用先序遍历、中序遍历和后序遍历三种方式来实现。递归计算T的深度可以采用以当前节点为根节点的左右子树深度的最大值加1的方式来实现。递归统计T中结点的个数可以采用以当前节点为根节点的左子树节点数加右子树节点数再加1的方式来实现。递归统计T中叶子结点的个数可以采用以当前节点为根节点的左右子树中叶子结点个数之和的方式来实现。
相关问题
用c语言编程构造二叉链表存储二叉树T以及用三种方式递归遍历T以及递归计算T的深度然后递归统计T中结点的个数以及递归统计T中叶子结点的个数的具体算法
答案:
构造二叉链表存储二叉树T的算法如下:
```
#define ElemType int
typedef struct BiTNode {
ElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
void CreateBiTree(BiTree *T) {
ElemType ch;
scanf("%d", &ch);
if (ch == 0) {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
```
三种方式递归遍历二叉树T的算法如下:
前序遍历:
```
void PreOrderTraverse(BiTree T) {
if (T) {
printf("%d ", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
```
中序遍历:
```
void InOrderTraverse(BiTree T) {
if (T) {
InOrderTraverse(T->lchild);
printf("%d ", T->data);
InOrderTraverse(T->rchild);
}
}
```
后序遍历:
```
void PostOrderTraverse(BiTree T) {
if (T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%d ", T->data);
}
}
```
递归计算二叉树T的深度的算法如下:
```
int TreeDepth(BiTree T) {
if (!T) {
return 0;
} else {
int leftDepth = TreeDepth(T->lchild);
int rightDepth = TreeDepth(T->rchild);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
```
递归统计二叉树T中结点的个数的算法如下:
```
int NodeCount(BiTree T) {
if (!T) {
return 0;
} else {
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
}
```
递归统计二叉树T中叶子结点的个数的算法如下:
```
int LeafCount(BiTree T) {
if (!T) {
return 0;
} else if (!T->lchild && !T->rchild) {
return 1;
} else {
return LeafCount(T->lchild) + LeafCount(T->rchild);
}
}
```
c语言 构造利用二叉链表存储表示的二叉树 利用先序遍历创建一个二叉树 递归计算二叉树的深度和叶子结点的个数。
好的,下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树的结构体
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
// 先序遍历创建二叉树
void CreateBiTree(BiTree *T) {
char c;
scanf("%c", &c);
if (c == ' ') {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = c;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
// 递归计算二叉树深度
int GetDepth(BiTree T) {
if (!T) {
return 0;
} else {
int left_depth = GetDepth(T->lchild);
int right_depth = GetDepth(T->rchild);
return (left_depth > right_depth ? left_depth : right_depth) + 1;
}
}
// 递归计算叶子节点个数
int GetLeafCount(BiTree T) {
if (!T) {
return 0;
} else if (!T->lchild && !T->rchild) {
return 1;
} else {
return GetLeafCount(T->lchild) + GetLeafCount(T->rchild);
}
}
int main() {
BiTree T;
printf("请按先序遍历的顺序输入二叉树(空格表示空节点):\n");
CreateBiTree(&T);
printf("二叉树的深度为:%d\n", GetDepth(T));
printf("叶子节点的个数为:%d\n", GetLeafCount(T));
return 0;
}
```
以上代码中,`BiTNode`是二叉树的结构体,包括数据域`data`和左右孩子指针`lchild`和`rchild`。`CreateBiTree`函数用于先序遍历创建二叉树。`GetDepth`函数用于递归计算二叉树的深度。`GetLeafCount`函数用于递归计算叶子节点个数。在`main`函数中,先调用`CreateBiTree`函数创建二叉树,然后调用`GetDepth`和`GetLeafCount`函数计算深度和叶子节点个数并输出结果。
阅读全文