给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度c语言实现
时间: 2023-07-24 07:34:11 浏览: 122
好的,我可以回答这个问题。首先,我们需要了解二叉树的先序遍历和中序遍历的定义。
先序遍历:先访问根节点,然后按照先左后右的顺序遍历左右子树。
中序遍历:先遍历左子树,访问根节点,再遍历右子树。
根据这两种遍历方式,我们可以递归地构造出二叉树。具体实现如下:
```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;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = *preorder;
int i;
for(i = 0; i < inorderSize; i++) {
if(inorder[i] == *preorder) {
break;
}
}
root->left = buildTree(preorder + 1, i, inorder, i);
root->right = buildTree(preorder + i + 1, preorderSize - i - 1, inorder + i + 1, inorderSize - i - 1);
return root;
}
// 计算二叉树的高度
int getHeight(TreeNode* root) {
if(root == NULL) {
return 0;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6};
int inorder[] = {4, 2, 5, 1, 3, 6};
int n = sizeof(preorder) / sizeof(int);
TreeNode* root = buildTree(preorder, n, inorder, n);
int height = getHeight(root);
printf("height = %d\n", height);
return 0;
}
```
在这段代码中,我们首先使用buildTree函数递归地构造二叉树,然后使用getHeight函数计算二叉树的高度。getHeight函数也是递归实现的,它计算当前节点的左子树和右子树的高度,然后取最大值再加上1,就是当前节点所在子树的高度。
注意:这里的节点高度是指节点到叶子节点的最长路径,而不是节点到根节点的距离。
阅读全文