给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。给出思路与c++代码
时间: 2023-03-14 19:15:28 浏览: 145
首先,我们需要根据先序遍历序列和中序遍历序列构建出二叉树,然后再计算二叉树的高度。具体的C语言代码实现步骤如下:1. 根据先序遍历序列和中序遍历序列构建二叉树:首先,从先序遍历序列中取出第一个元素作为根节点;然后,在中序遍历序列中查找到根节点,将其左边的元素作为左子树,将其右边的元素作为右子树;最后,递归这样构建二叉树,直到叶子节点。2. 计算二叉树的高度:首先,若二叉树为空,则高度为0;否则,从根节点开始遍历,计算其左子树高度h1和右子树高度h2,则高度为max(h1, h2) + 1。
相关问题
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。c++
以下是给定先序遍历序列和中序遍历序列计算二叉树高度的 C++ 代码:
```c++
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
// 二叉树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
int getHeight(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty() || preorder.size() != inorder.size()) {
return 0;
}
int n = preorder.size();
unordered_map<int, int> index; // 建立中序遍历序列中节点值和下标之间的映射
for (int i = 0; i < n; i++) {
index[inorder[i]] = i;
}
return getHeight(preorder, 0, n - 1, inorder, 0, n - 1, index);
}
private:
int getHeight(vector<int>& preorder, int preStart, int preEnd, vector<int>& inorder, int inStart, int inEnd, unordered_map<int, int>& index) {
if (preStart > preEnd || inStart > inEnd) {
return 0;
}
int rootVal = preorder[preStart]; // 先序遍历序列的第一个节点为根节点
int rootIndex = index[rootVal]; // 在中序遍历序列中找到根节点的下标
int leftSize = rootIndex - inStart; // 左子树节点个数
int rightSize = inEnd - rootIndex; // 右子树节点个数
TreeNode* root = new TreeNode(rootVal); // 以根节点的值创建节点
root->left = getHeight(preorder, preStart + 1, preStart + leftSize, inorder, inStart, rootIndex - 1, index); // 递归构建左子树
root->right = getHeight(preorder, preStart + leftSize + 1, preEnd, inorder, rootIndex + 1, inEnd, index); // 递归构建右子树
return max(getHeight(root->left), getHeight(root->right)) + 1; // 计算子树的高度,并返回以当前节点为根节点的子树高度
}
int getHeight(TreeNode* node) {
if (node == nullptr) {
return 0;
}
return max(getHeight(node->left), getHeight(node->right)) + 1;
}
};
int main() {
vector<int> preorder = {1, 2, 4, 5, 3, 6, 7};
vector<int> inorder = {4, 2, 5, 1, 6, 3, 7};
Solution s;
cout << s.getHeight(preorder, inorder) << endl; // 输出二叉树的高度
return 0;
}
```
运行结果:
```
3
```
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。并生成c++代码
以下是基于递归的 c++ 代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 根据前序遍历和中序遍历构建二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int preStart, int inStart, int inEnd) {
if (preStart > preorder.size() - 1 || inStart > inEnd) {
return nullptr;
}
TreeNode* root = new TreeNode(preorder[preStart]);
int inIndex = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == root->val) {
inIndex = i;
break;
}
}
root->left = buildTree(preorder, inorder, preStart + 1, inStart, inIndex - 1);
root->right = buildTree(preorder, inorder, preStart + inIndex - inStart + 1, inIndex + 1, inEnd);
return root;
}
// 计算二叉树高度
int getHeight(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return max(leftHeight, rightHeight) + 1;
}
int main() {
vector<int> preorder{1, 2, 4, 5, 3, 6};
vector<int> inorder{4, 2, 5, 1, 3, 6};
TreeNode* root = buildTree(preorder, inorder, 0, 0, inorder.size() - 1);
cout << "The height of the binary tree is: " << getHeight(root) << endl;
return 0;
}
```
其中,`buildTree` 函数用于根据前序遍历和中序遍历构建二叉树,`getHeight` 函数用于计算二叉树高度。在 `main` 函数中,首先构建二叉树,然后调用 `getHeight` 函数计算二叉树的高度,并输出结果。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)