c语言输入先序遍历,创建一棵二叉树
时间: 2023-11-11 09:04:19 浏览: 113
如果您想要根据先序遍历的结果创建一棵二叉树,可以按照以下步骤进行:
1. 定义二叉树的结构体,包含左右子节点和节点值:
```
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
```
2. 创建一个新节点:
```
TreeNode* createNode(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
```
3. 根据先序遍历的结果构建二叉树:
```
TreeNode* buildTree(int* preorder, int preorderSize) {
if (preorderSize == 0) {
return NULL;
}
TreeNode* root = createNode(preorder[0]);
int i = 1;
while (i < preorderSize && preorder[i] < root->val) {
i++;
}
root->left = buildTree(preorder + 1, i - 1);
root->right = buildTree(preorder + i, preorderSize - i);
return root;
}
```
在这里,我们首先判断先序遍历结果是否为空,如果是,直接返回`NULL`。否则,我们创建一个新节点,将先序遍历结果的第一个元素作为节点值,并将左右子节点初始化为`NULL`。接下来,我们遍历数组,找到第一个大于等于根节点值的元素下标,将其作为左右子树的分界点。然后,递归构建左右子树,并将其作为根节点的左右子节点。
完整的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
// 二叉树结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建一个新节点
TreeNode* createNode(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 根据先序遍历的结果构建二叉树
TreeNode* buildTree(int* preorder, int preorderSize) {
if (preorderSize == 0) {
return NULL;
}
TreeNode* root = createNode(preorder[0]);
int i = 1;
while (i < preorderSize && preorder[i] < root->val) {
i++;
}
root->left = buildTree(preorder + 1, i - 1);
root->right = buildTree(preorder + i, preorderSize - i);
return root;
}
// 中序遍历
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
int main() {
int preorder[] = {5, 2, 1, 3, 7, 6, 8};
int n = sizeof(preorder) / sizeof(int);
TreeNode* root = buildTree(preorder, n);
printf("中序遍历结果:");
inorderTraversal(root);
printf("\n");
return 0;
}
```
在这个示例代码中,我们输入了一个先序遍历的结果`{5, 2, 1, 3, 7, 6, 8}`,并根据其构建了一棵二叉树,并进行了中序遍历,打印出了遍历结果`1 2 3 5 6 7 8`。
阅读全文