C语言用先序中序构建二叉树的主要问题和解决方法
时间: 2024-05-11 13:19:51 浏览: 52
在使用先序中序构建二叉树时,主要问题是如何确定每个节点的左子树和右子树。下面介绍一种解决方法:
1. 以先序遍历的第一个节点为根节点。
2. 在中序遍历中找到根节点的位置,根节点左侧的所有节点都属于左子树,右侧的所有节点都属于右子树。
3. 根据左子树和右子树的节点数,可以在先序遍历中确定左子树和右子树的节点范围。
4. 递归地构建左子树和右子树。
具体实现可以参考如下代码:
```c
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 i;
for (i = 0; i < inorderSize; i++) {
if (inorder[i] == root->val) {
break;
}
}
int leftSize = i;
int rightSize = inorderSize - i - 1;
root->left = buildTree(preorder + 1, leftSize, inorder, leftSize);
root->right = buildTree(preorder + 1 + leftSize, rightSize, inorder + i + 1, rightSize);
return root;
}
```
在这个代码中,preorder 和 inorder 分别是先序遍历和中序遍历的数组,preorderSize 和 inorderSize 是它们的长度。递归函数 buildTree 返回根节点的指针。
阅读全文