NC136 输出二叉树的右视图(树)

描述

请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
如输入[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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值