一. 申明:
该题目来自卡玛网KamaCoder https://kamacoder.com/
二. 题目描述
现给定一棵二叉树的先序遍历序列和中序遍历序列,要求你计算该二叉树的高度。
输入描述
输入包含多组测试数据,每组输入首先给出正整数N(<=50),为树中结点总数。下面2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出描述
对于每组输入,输出一个整数,即该二叉树的高度。
输入示例
9
ABDFGHIEC
FDHGIBEAC
7
Abcdefg
gfedcbA
输出示例
5
7
三. 解题思路
1. 流程如图:
2. 解题步骤
-
第一步:如果字符串为空的话,说明是空节点了。
-
第二步:如果不为空,那么取前序字符串的第一个元素作为节点元素。
-
第三步:找到前序字符串第一个元素在中序字符串的位置,作为切割点
-
第四步:切割中序字符串,切成中序左字符串和中序右字符串 (顺序别搞反了,一定是先切中序字符串)
-
第五步:切割前序字符串,切成前序左字符串和前序右字符串
-
第六步:递归处理左区间和右区间
-
第七步:二叉树构造完成后返回根节点
-
第八步:计算二叉树的高度(递归和非递归两步)
3. 代码展示
#include<iostream>
#include<vector>
#include<string>
#include<queue>
using namespace std;
struct TreeNode{
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x):val(x), left(nullptr), right(nullptr){}
};
TreeNode* creatTree(string& pre, string& in){ // 通过前序和中序构造二叉树
if(pre.size() == 0) return nullptr;
TreeNode* root = new TreeNode(pre[0]);
int index = 0;
for(int i = 0; i < in.size(); i++){
if(in[i] == pre[0]){
index = i;
break;
}
}
// 切中序的左右子树
string leftIn(in.begin(), in.begin() + index);
string rightIn(in.begin() + index + 1, in.end());
// 删除前序的第一位(二叉树根节点)
pre.erase(pre.begin());
// 切前序的左右子树
string leftPre(pre.begin(), pre.begin() + leftIn.size());
string rightPre(pre.begin() + leftIn.size(), pre.end());
// 递归构造root的左右子树
root->left = creatTree(leftPre, leftIn);
root->right = creatTree(rightPre, rightIn);
return root;
}
// // 计算二叉树的最大高度(层序,非递归)
// int treeHight(TreeNode* root){
// queue<TreeNode*> que;
// if(root) que.push(root);
// int height = 0;
// while(!que.empty()){
// int size = que.size();
// while(size--){
// TreeNode* node = que.front();
// que.pop();
// if(node->left) que.push(node->left);
// if(node->right) que.push(node->right);
// }
// height++;
// }
// return height;
// }
// 深搜求最大高度(递归)
int maxD = 0;
void height(TreeNode* root, int deep){
if(root == nullptr) return;
else{
deep++;
height(root->left, deep);
height(root->right, deep);
maxD = max(maxD, deep);
}
}
int main(){
int n;
string s1, s2;
while(cin >> n >> s1 >> s2){
TreeNode* root = creatTree(s1, s2);
// cout << treeHight(root) << endl;
height(root, 0);
cout << maxD << endl;
}
return 0;
}
四. 总结
该类题目属于二叉树基础题目,卡码网和力扣中都有相关题目,建议多练习一下,稳固二叉树的基础知识。每天都会更新一些数据结构相关题目,感兴趣的话就关注一下吧!!!