版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/84799296
我的数据结构与算法题目集代码仓:https://github.com/617076674/Data-structure-and-algorithm-topic-set
原题链接:https://pintia.cn/problem-sets/15/problems/838
题目描述:
知识点:根据前序遍历和中序遍历重建二叉树、二叉树的层序遍历
思路:先根据前序遍历和中序遍历重建二叉树,再层序遍历计算高度
时间复杂度和空间复杂度均是O(N)。
C++代码:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct node{
char c;
int lchild, rchild;
};
int N, num = 0;
vector<char> preOrder, inOrder;
node Node[50];
int height = 0;
int create(int preLeft, int preRight, int inLeft, int inRight);
void levelOrderTraversal(int root);
int main(){
scanf("%d", &N);
char input1[N + 1], input2[N + 1];
scanf("%s", input1);
for(int i = 0; i < strlen(input1); i++){
preOrder.push_back(input1[i]);
}
scanf("%s", input2);
for(int i = 0; i < strlen(input2); i++){
inOrder.push_back(input2[i]);
}
int root = create(0, preOrder.size() - 1, 0, inOrder.size() - 1);
levelOrderTraversal(root);
printf("%d\n", height);
return 0;
}
int create(int preLeft, int preRight, int inLeft, int inRight){
if(preLeft > preRight){
return -1;
}
int head = num++;
Node[head].c = preOrder[preLeft];
int k;
for(int i = inLeft; i <= inRight; i++){
if(inOrder[i] == preOrder[preLeft]){
k = i;
break;
}
}
int numLeft = k - inLeft;
Node[head].lchild = create(preLeft + 1, preLeft + numLeft, inLeft, k - 1);
Node[head].rchild = create(preLeft + numLeft + 1, preRight, k + 1, inRight);
return head;
}
void levelOrderTraversal(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int qSize = q.size();
for(int i = 0; i < qSize; i++){
int u = q.front();
q.pop();
if(Node[u].lchild != -1){
q.push(Node[u].lchild);
}
if(Node[u].rchild != -1){
q.push(Node[u].rchild);
}
}
height++;
}
}
C++解题报告: