描述
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
如输入[1,2,4,5,3],[4,2,5,1,3]时,通过前序遍历的结果[1,2,4,5,3]和中序遍历的结果[4,2,5,1,3]可重建出以下二叉树:所以对应的输出为[1,3,5]。
解题思路:递归建树+利用队列层序遍历
class Solution {
public:
//建立树的结构体
struct Node{
int val;
Node* left;
Node* right;
Node(): val(0),left(nullptr),right(nullptr){}
Node(int x):val(x),left(nullptr),right(nullptr){}
};
Node* build(vector<int>& xianxu, vector<int>& zhongxu, int L1,int R1,int L2,int R2){
if(L1>R1||L2>R2) return nullptr;
int val=xianxu[L1];//以前序遍历的第一个元素为根
int p=L2;
while(zhongxu[p]!=val) p++;//寻找中序遍历根节点的位置
int jump=p-L2;//左子树的长度
Node* root=new Node(val);
//递归建立左右子树
root->left=build(xianxu,zhongxu,L1+1,L1+jump,L2,p-1);
root->right=build(xianxu,zhongxu,L1+1+jump,R1,p+1,R2);
return root;
}
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
Node* root=build(xianxu, zhongxu, 0,xianxu.size()-1,0,zhongxu.size()-1);
vector<int> ans;
if(root==nullptr) return ans;
//层序遍历得到右视图
queue<Node* > q;
q.push(root);
while(!q.empty()){
int n=q.size();//当前层的长度
for(int i=0;i<n;i++){
Node* t=q.front();
q.pop();
if(i==n-1) ans.push_back(t->val);//每层最后一个节点
if(t->left!=nullptr) q.push(t->left);
if(t->right!=nullptr) q.push(t->right);
}
}
return ans;
}
};
时间复杂度:O(n^2),
空间复杂度:O(n)