c语言已知二叉树先序和中序求二叉树
时间: 2023-08-16 07:21:59 浏览: 143
由先序和中序序列确定二叉树
同样可以通过递归方式来构建二叉树,下面是 C 语言的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if (preorderSize == 0 || inorderSize == 0) {
return NULL;
}
int rootVal = preorder[0];
TreeNode* root = (TreeNode*) malloc(sizeof(TreeNode));
root->val = rootVal;
root->left = NULL;
root->right = NULL;
int pos;
for (pos = 0; pos < inorderSize; pos++) {
if (inorder[pos] == rootVal) {
break;
}
}
int leftInorderSize = pos;
int rightInorderSize = inorderSize - pos - 1;
int* leftPreorder = preorder + 1;
int* rightPreorder = preorder + leftInorderSize + 1;
int* leftInorder = inorder;
int* rightInorder = inorder + pos + 1;
root->left = buildTree(leftPreorder, leftInorderSize, leftInorder, leftInorderSize);
root->right = buildTree(rightPreorder, rightInorderSize, rightInorder, rightInorderSize);
return root;
}
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6, 7};
int inorder[] = {4, 2, 5, 1, 6, 3, 7};
int size = sizeof(preorder) / sizeof(preorder[0]);
TreeNode* root = buildTree(preorder, size, inorder, size);
inorderTraversal(root);
return 0;
}
```
上面的代码中,`buildTree` 函数就是用于构建二叉树的函数,其中 `preorder` 和 `inorder` 分别表示先序遍历和中序遍历的结果,`preorderSize` 和 `inorderSize` 则是对应结果数组的大小。函数首先判断结果数组是否为空,若为空则返回 `NULL`。接着,函数取出 `preorder` 中的第一个值作为根节点的值,然后在 `inorder` 中找到该值所在的位置 `pos`。根据中序遍历的特点,`inorder` 中 `pos` 左边的节点都在左子树中,`pos` 右边的节点都在右子树中。因此,可以将 `preorder` 和 `inorder` 分别划分成左子树和右子树的部分,然后递归构建左子树和右子树。函数返回构建好的根节点。
最后,可以使用 `inorderTraversal` 函数对构建好的二叉树进行中序遍历,以验证构建结果是否正确。
阅读全文