题解 | #输出二叉树的右视图#

输出二叉树的右视图

https://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

// struct TreeNode{
//     int val;
//     TreeNode* left;
//     TreeNode* right;
// }


class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型vector 先序遍历
     * @param zhongxu int整型vector 中序遍历
     * @return int整型vector
     */
    TreeNode* buildTree(vector<int>& pre,vector<int>& vin){
        int n = pre.size();
        int m = vin.size();
        if(m == 0 || n == 0) return nullptr;
        TreeNode* p = new TreeNode(pre[0]);
        for(int i = 0;i < m;i ++){
            if(pre[0] == vin[i]){
                vector<int> leftPre(pre.begin() + 1,pre.begin() + 1 + i);
                vector<int> leftVin(vin.begin(),vin.begin() + i);
                p -> left = buildTree(leftPre,leftVin);
                vector<int> rightPre(pre.begin() + 1 + i,pre.end());
                vector<int> rightVin(vin.begin() + 1 + i,vin.end());
                p -> right = buildTree(rightPre,rightVin);
                break;
            }
        }
        return p;
    }   

    vector<int> findRight(TreeNode* proot){
        vector<int> res;
        if(!proot) return res;
        queue<TreeNode*> q;
        q.push(proot);
        while(!q.empty()){
            int right = 0;
            int length = q.size();
            for(int i = 0;i < length;i ++){
                if(q.front() -> left) q.push(q.front() -> left);
                if(q.front() -> right) q.push(q.front() -> right);
                right = q.front() -> val;
                q.pop();
            }
            res.push_back(right);
        }
        return res;
    }

    void printTree(TreeNode* proot){
        if(proot == nullptr) return;
        //cout << proot -> val << " ";
        printTree(proot -> left);
        printTree(proot -> right);
    }

    vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
        // write code here
        vector<int> res;
        if(xianxu.size() != zhongxu.size() || xianxu.size() == 0 || zhongxu.size() == 0){
            return res;
        }
        TreeNode* tree = new TreeNode(0);
        tree = buildTree(xianxu,zhongxu);
        printTree(tree);
        res = findRight(tree);
        return res;
    }
};

经过这几天的刷题,由自己不开代码补全做出来的。还是有进步。

就是融合了重建二叉树和层次遍历的一道题。

记录一下。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务