如何用C语言根据二叉树的先序遍历和中序遍历来计算其高度?需要具体程序
时间: 2024-10-21 12:10:51 浏览: 22
erchashu.rar_ABC_二叉树的遍历_遍历
在C语言中,我们可以利用递归的方式来根据二叉树的先序遍历(根-左-右)和中序遍历(左-根-右)重建二叉树,然后通过计算完全二叉树的高度(对于所有节点都有两个儿子的二叉树,除了最后一层外,其他层都是满的,最后一层的节点都尽可能地靠左)。这里是一个基本的步骤:
1. 首先,我们需要分别存储先序和中序遍历的结果。例如,`preorder[]` 和 `inorder[]` 分别表示先序和中序遍历的数组。
2. 定义一个函数`buildTree()`来根据这两个数组构建二叉树。该函数通常接受根节点指针、先序遍历的起始位置和结束位置,以及中序遍历的起始位置作为参数。
3. 使用递归创建二叉树。在`buildTree()`中,我们首先从先序遍历中找到当前根节点,将其插入到中序遍历对应的位置,并返回新生成的根节点。
4. 接着,在`buildTree()`递归过程中,我们会更新先序和中序遍历的起始位置,因为已经处理了一个子树。
5. 当遍历完成后,根节点即为我们所需的二叉树,接下来就是计算它的高度。可以定义另一个辅助函数`height()`,递归地计算左子树和右子树的高度并取较大值加一。
下面是一个简单的伪代码示例:
```c
// 假设preorder, inorder长度相同
int buildTree(int* preorder, int* inorder, int startIn, int endIn) {
// 根据先序遍历找到根节点
int rootVal = preorder[startIn];
// 在中序遍历中定位根节点
int i;
for (i = startIn; i < endIn; i++) {
if (inorder[i] == rootVal)
break;
}
// 创建根节点并初始化左右子树
TreeNode* root = new TreeNode(rootVal);
root->left = buildTree(preorder, inorder, startIn + 1, i - 1); // 左子树
root->right = buildTree(preorder, inorder, i + 1, endIn); // 右子树
return root;
}
int height(TreeNode* root) {
if (root == NULL)
return 0;
else
return 1 + max(height(root->left), height(root->right));
}
int main() {
TreeNode* root = buildTree(preorder, inorder, 0, sizeof(preorder)/sizeof(preorder[0]) - 1);
int treeHeight = height(root);
// 输出树的高度
printf("The height of the binary tree is %d\n", treeHeight);
return 0;
}
```
阅读全文