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

输出二叉树的右视图

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

这个方法可能不是最优解,e.....或者说肯定不是最优解🤔
但易于理解
基于重建二叉树和求二叉树的层序遍历,就能完成。

vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) 
    {
        // write code here
        // 构建二叉树
        TreeNode* root = resConstrain(xianxu, zhongxu);

        vector<int> res{}; // 保存层序遍历的结果,这里做一个处理,层序遍历,只保存每层的最后一个数值

        //层序遍历,输出最右边的值
        TreeNode* curr{};
        queue<TreeNode*> queue{};
        queue.push(root);
        while (!queue.empty())
        {
            int n  = queue.size();
            for (int i = 0; i < n; ++i)
            {
                curr = queue.front();
                queue.pop();

                // 注意这里,我们只再每一层的最后一个,才去存进数组
                if (i == n - 1)
                {
                    res.push_back(curr->val);
                }

                if (curr->left)
                {
                    queue.push(curr->left);
                }

                if (curr->right)
                {
                    queue.push(curr->right);
                }
            }
        }
        return res;
    }

    // 重建二叉树,这个和另一道题的解题代码如出一辙,没有任何变化
    TreeNode* resConstrain(vector<int> pre, vector<int> vin)
    {
        int preLen = pre.size();
        int vinLen = vin.size();

        if (preLen == 0 || vinLen == 0)
        {
            return nullptr;
        }

        TreeNode* root = new TreeNode(pre[0]);
        for (int i = 0; i < vinLen; ++i)
        {
            if (pre[0] == vin[i])
            {
                vector<int> preLeft(pre.begin() + 1, pre.begin() + i + 1);
                vector<int> vinLeft(vin.begin(), vin.begin() + i);
                root->left = resConstrain(preLeft, vinLeft);

                vector<int> preRight(pre.begin() + i + 1, pre.end());
                vector<int> vinRight(vin.begin() + i + 1, vin.end());
                root->right = resConstrain(preRight, vinRight);
            }
        }
        return root;
    }
全部评论

相关推荐

10-05 11:11
海南大学 Java
投票
理想江南137:感觉挺真诚的 感觉可以试一试
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务