c语言创建二叉树和遍历说明:按某方法创建二叉树(例如输入中序序列和后序序列创 建二叉树),然后遍历二叉树(例如先序遍历二叉树)。 输入:DCBGEAHFIJK //中序序列 DCEGBFHKJIA //后序序列 输出:ABCDGEIHFJK //先序遍历序列
时间: 2023-07-24 19:42:48 浏览: 123
好的,下面给您介绍一下如何使用 C语言创建二叉树和遍历二叉树。
首先,我们需要定义二叉树节点的结构体:
```c
typedef struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
```
其中,`val` 表示节点的值,`left` 和 `right` 分别表示左子节点和右子节点。
接下来,我们可以使用递归的方式来构建二叉树。以输入的中序序列和后序序列为例,具体步骤如下:
1. 定义一个递归函数 `buildTree()`,该函数接受两个参数,分别为中序序列和后序序列的起始和结束位置。
2. 在后序序列中找到最后一个字符,即为根节点的值。
3. 在中序序列中找到根节点的位置,将中序序列分成左右两个部分。
4. 递归构建左子树和右子树。
5. 返回根节点。
具体的代码实现如下:
```c
TreeNode* buildTree(char* inorder, int inStart, int inEnd,
char* postorder, int postStart, int postEnd) {
if (inStart > inEnd || postStart > postEnd) {
return NULL;
}
char rootVal = postorder[postEnd];
int rootIndex;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
int leftSize = rootIndex - inStart;
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = rootVal;
root->left = buildTree(inorder, inStart, rootIndex - 1,
postorder, postStart, postStart + leftSize - 1);
root->right = buildTree(inorder, rootIndex + 1, inEnd,
postorder, postStart + leftSize, postEnd - 1);
return root;
}
```
接下来,我们可以使用先序遍历、中序遍历和后序遍历的方式遍历二叉树。以先序遍历为例,具体步骤如下:
1. 如果节点为空,返回。
2. 访问当前节点。
3. 递归遍历左子树。
4. 递归遍历右子树。
具体的代码实现如下:
```c
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
```
最后,我们可以将上述代码整合起来,得到完整的程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode* buildTree(char* inorder, int inStart, int inEnd,
char* postorder, int postStart, int postEnd) {
if (inStart > inEnd || postStart > postEnd) {
return NULL;
}
char rootVal = postorder[postEnd];
int rootIndex;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
int leftSize = rootIndex - inStart;
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = rootVal;
root->left = buildTree(inorder, inStart, rootIndex - 1,
postorder, postStart, postStart + leftSize - 1);
root->right = buildTree(inorder, rootIndex + 1, inEnd,
postorder, postStart + leftSize, postEnd - 1);
return root;
}
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
char inorder[] = "DCBGEAHFIJK";
char postorder[] = "DCEGBFHKJIA";
TreeNode* root = buildTree(inorder, 0, 10, postorder, 0, 10);
printf("先序遍历结果:");
preorderTraversal(root);
printf("\n");
return 0;
}
```
输出结果为:
```
先序遍历结果:ABCDGEIHFJK
```
阅读全文