给出c语言代码:给定一个二叉树的先序遍历和中序遍历,求树的高度
时间: 2024-10-13 22:16:51 浏览: 99
在 C 语言中,如果你需要根据二叉树的先序遍历(Preorder Traversal)和中序遍历(Inorder Traversal)重建一棵树并计算其高度,通常可以借助哈希表(或类似的数据结构)来存储节点信息,因为先序遍历的第一个元素是根节点,而中序遍历可以帮助确定左子树和右子树的范围。
以下是一个简单的示例代码片段,它使用了递归的方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 使用哈希表辅助查找中序遍历中的位置
int searchInOrder(int inOrder[], int start, int end, int target) {
if (start > end)
return -1;
int mid = start + (end - start) / 2;
if (inOrder[mid] == target)
return mid;
else if (inOrder[mid] < target)
return searchInOrder(inOrder, mid + 1, end, target);
else
return searchInOrder(inOrder, start, mid - 1, target);
}
// 根据先序和中序遍历构建二叉树并返回根节点
TreeNode* buildTree(int preorder[], int inorder[], int n) {
if (n <= 0)
return NULL;
// 先序遍历的第一个元素作为根节点
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = preorder[0];
// 找到根节点在中序遍历中的位置
int index = searchInOrder(inorder, 0, n - 1, root->val);
// 分别递归处理左右子树
root->left = buildTree(preorder + 1, inorder, index);
root->right = buildTree(preorder + index + 1, inorder + index + 1, n - index - 1);
return root;
}
// 二叉树的高度计算函数
int height(TreeNode* node) {
if (node == NULL)
return 0;
else {
int left_height = height(node->left);
int right_height = height(node->right);
return (left_height > right_height ? left_height : right_height) + 1;
}
}
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6};
int inorder[] = {4, 2, 5, 1, 6, 3};
int n = sizeof(preorder) / sizeof(preorder[0]);
TreeNode *root = buildTree(preorder, inorder, n);
int treeHeight = height(root);
printf("Tree Height: %d\n", treeHeight);
return 0;
}
```
这个程序首先创建了一个 `buildTree` 函数,用于根据给定的先序和中序遍历重构二叉树。然后利用 `height` 函数计算树的高度。注意,这个代码假设输入的先序遍历数组和中序遍历数组都是正确的,并且对应于同一棵树。
阅读全文