C语言用先序中序构建二叉树的算法思想
时间: 2023-10-18 22:09:37 浏览: 91
先序遍历和中序遍历可以唯一确定一棵二叉树,因此可以利用这两种遍历的结果构建一棵二叉树。算法思想如下:
1. 在先序遍历中,第一个节点是根节点。
2. 在中序遍历中,根节点将中序遍历序列分为左子树和右子树两部分。
3. 根据左子树的节点数,在先序遍历中确定左子树的先序遍历序列,右子树同理。
4. 对于左子树和右子树分别递归执行上述步骤,构建左子树和右子树。
具体实现可以参考下面的代码:
```c
#include<stdio.h>
#include<stdlib.h>
// 二叉树节点结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 在中序遍历中查找根节点的位置
int search(int* inorder, int inorderSize, int val) {
for (int i = 0; i < inorderSize; i++) {
if (inorder[i] == val) {
return i;
}
}
return -1;
}
// 构建二叉树
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if (preorderSize == 0 || inorderSize == 0) {
return NULL;
}
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = preorder[0];
int pos = search(inorder, inorderSize, root->val);
root->left = buildTree(preorder + 1, pos, inorder, pos);
root->right = buildTree(preorder + pos + 1, preorderSize - pos - 1, inorder + pos + 1, inorderSize - pos - 1);
return root;
}
// 中序遍历二叉树
void inorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
int main() {
int preorder[] = {3, 9, 20, 15, 7};
int inorder[] = {9, 3, 15, 20, 7};
int size = sizeof(preorder) / sizeof(int);
struct TreeNode* root = buildTree(preorder, size, inorder, size);
inorderTraversal(root);
return 0;
}
```
以上代码实现了先序遍历和中序遍历构建二叉树的算法思想,并输出了中序遍历结果。
阅读全文