c语言用递归的方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树(算法 5.3); 2.输出二叉树的中序遍历结果(算法 5.1); 3.输出二叉树的前序遍历结果(见讲稿); 4.输出二叉树的后序遍历结果(见讲稿); 5.计算二叉树的深度(算法 5.5); 6.统计二叉树的结点个数(算法 5.6); 7.统计二叉树的叶结点个数; 8.统计二叉树的度为 1 的结点个数; 9.输出二叉树中从每个叶子结点到根结点的路径。
时间: 2023-11-14 19:09:46 浏览: 262
erchashubianli.rar_用二叉链表 进行 二叉树 遍历
好的,以下是实现这些算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点结构体
typedef struct TreeNode {
int data; // 数据域
struct TreeNode *left; // 左子树指针
struct TreeNode *right; // 右子树指针
} TreeNode, *Tree;
// 建立二叉树
void createTree(Tree *t) {
int data;
scanf("%d", &data);
if (data == -1) { // 输入 -1 表示该节点为空
*t = NULL;
} else {
*t = (Tree)malloc(sizeof(TreeNode)); // 创建新节点
(*t)->data = data;
createTree(&((*t)->left)); // 递归创建左子树
createTree(&((*t)->right)); // 递归创建右子树
}
}
// 中序遍历
void inorderTraversal(Tree t) {
if (t != NULL) {
inorderTraversal(t->left); // 先遍历左子树
printf("%d ", t->data); // 访问根节点
inorderTraversal(t->right); // 再遍历右子树
}
}
// 前序遍历
void preorderTraversal(Tree t) {
if (t != NULL) {
printf("%d ", t->data); // 访问根节点
preorderTraversal(t->left); // 先遍历左子树
preorderTraversal(t->right); // 再遍历右子树
}
}
// 后序遍历
void postorderTraversal(Tree t) {
if (t != NULL) {
postorderTraversal(t->left); // 先遍历左子树
postorderTraversal(t->right); // 再遍历右子树
printf("%d ", t->data); // 访问根节点
}
}
// 计算二叉树深度
int getDepth(Tree t) {
if (t == NULL) {
return 0;
} else {
int leftDepth = getDepth(t->left); // 计算左子树深度
int rightDepth = getDepth(t->right); // 计算右子树深度
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1; // 返回深度较大的值加上 1
}
}
// 统计节点个数
int getNodeCount(Tree t) {
if (t == NULL) {
return 0;
} else {
return getNodeCount(t->left) + getNodeCount(t->right) + 1; // 左子树节点数加右子树节点数加上自身
}
}
// 统计叶子节点个数
int getLeafCount(Tree t) {
if (t == NULL) {
return 0;
} else if (t->left == NULL && t->right == NULL) { // 如果是叶节点
return 1;
} else {
return getLeafCount(t->left) + getLeafCount(t->right); // 左子树叶子节点数加右子树叶子节点数
}
}
// 统计度为 1 的节点个数
int getDegree1Count(Tree t) {
if (t == NULL) {
return 0;
} else if (t->left == NULL && t->right != NULL) { // 如果只有右子树
return getDegree1Count(t->right) + 1; // 右子树中度为 1 的节点数加上自身
} else if (t->left != NULL && t->right == NULL) { // 如果只有左子树
return getDegree1Count(t->left) + 1; // 左子树中度为 1 的节点数加上自身
} else { // 否则递归统计左右子树中度为 1 的节点数
return getDegree1Count(t->left) + getDegree1Count(t->right);
}
}
// 输出从叶子节点到根节点的路径
void printPathsFromLeavesToRoot(Tree t, int path[], int pathLen) {
if (t == NULL) {
return;
} else {
path[pathLen++] = t->data; // 将当前节点加入路径
if (t->left == NULL && t->right == NULL) { // 如果是叶节点,输出路径
printf("Path: ");
for (int i = pathLen - 1; i >= 0; i--) {
printf("%d ", path[i]);
}
printf("\n");
} else {
printPathsFromLeavesToRoot(t->left, path, pathLen); // 递归遍历左子树
printPathsFromLeavesToRoot(t->right, path, pathLen); // 递归遍历右子树
}
}
}
int main() {
Tree t;
printf("请输入一棵二叉树(-1表示该节点为空):\n");
createTree(&t); // 建立二叉树
printf("中序遍历结果为:");
inorderTraversal(t); // 中序遍历
printf("\n前序遍历结果为:");
preorderTraversal(t); // 前序遍历
printf("\n后序遍历结果为:");
postorderTraversal(t); // 后序遍历
printf("\n二叉树深度为:%d\n", getDepth(t)); // 计算深度
printf("二叉树节点个数为:%d\n", getNodeCount(t)); // 统计节点个数
printf("二叉树叶子节点个数为:%d\n", getLeafCount(t)); // 统计叶子节点个数
printf("二叉树度为1的节点个数为:%d\n", getDegree1Count(t)); // 统计度为 1 的节点个数
int path[1000];
printf("从每个叶子节点到根节点的路径为:\n");
printPathsFromLeavesToRoot(t, path, 0); // 输出从叶子节点到根节点的路径
return 0;
}
```
希望这份代码能够帮助到你!
阅读全文