用c语言来实现:编写二叉树的递归遍历算法,实现:给定一棵二叉树的“扩展先序遍历序列”,创建这棵二叉树。实现以下功能 1.输出二叉树的先序遍历的结点序列 2.输出二叉树的后序遍历的结点序列 3.输出二叉树的中序遍历的结点序列 4.输出二叉树的叶子结点 5.统计二叉树的结点个数
时间: 2023-12-01 13:06:13 浏览: 113
用递归算法实现的二叉树的遍历
5星 · 资源好评率100%
以下是C语言实现二叉树的递归遍历算法的代码:
```C
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
char data; // 节点数据
struct TreeNode *left; // 左子树指针
struct TreeNode *right; // 右子树指针
} TreeNode, *pTreeNode;
// 创建二叉树
pTreeNode createTree(char **str) {
char *p = *(str++);
if (*p == '\0') {
return NULL;
}
pTreeNode node = (pTreeNode)malloc(sizeof(TreeNode));
node->data = *p;
node->left = createTree(str);
node->right = createTree(str);
return node;
}
// 先序遍历
void preOrderTraversal(pTreeNode root) {
if (root == NULL) {
return;
}
printf("%c ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序遍历
void inOrderTraversal(pTreeNode root) {
if (root == NULL) {
return;
}
inOrderTraversal(root->left);
printf("%c ", root->data);
inOrderTraversal(root->right);
}
// 后序遍历
void postOrderTraversal(pTreeNode root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%c ", root->data);
}
// 输出叶子节点
void printLeaves(pTreeNode root) {
if (root == NULL) {
return;
}
if (root->left == NULL && root->right == NULL) {
printf("%c ", root->data);
}
printLeaves(root->left);
printLeaves(root->right);
}
// 统计节点个数
int countNodes(pTreeNode root) {
if (root == NULL) {
return 0;
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
int main() {
char *str = "ABD##E##C#F##";
pTreeNode root = createTree(&str);
printf("先序遍历:");
preOrderTraversal(root);
printf("\n");
printf("中序遍历:");
inOrderTraversal(root);
printf("\n");
printf("后序遍历:");
postOrderTraversal(root);
printf("\n");
printf("叶子节点:");
printLeaves(root);
printf("\n");
printf("节点个数:%d\n", countNodes(root));
return 0;
}
```
解释一下代码:
1. 定义了二叉树结构体,包含节点数据和左右子树指针;
2. `createTree`函数用于创建二叉树,参数为扩展先序遍历序列的指针的指针,返回值为二叉树的根节点指针;
3. `preOrderTraversal`、`inOrderTraversal`、`postOrderTraversal`和`printLeaves`分别是先序、中序、后序遍历和输出叶子节点的函数;
4. `countNodes`函数用于统计节点个数,返回值为节点个数;
5. `main`函数中,先调用`createTree`函数创建二叉树,然后分别调用其他函数实现各种功能。
注意,这里的二叉树是用扩展先序遍历序列来创建的,即空节点用`#`表示。例如,扩展先序遍历序列`ABD##E##C#F##`表示的二叉树如下:
```
A
/ \
B C
/ / \
D F E
```
阅读全文