牛客BM41. 输出二叉树的右视图

Description:

题目大意:给出二叉树的前序遍历和中序遍历,输出右视图。

解题思路:

算法标签:BFS

  1. 通过前序遍历和中序遍历构造二叉树。
  2. 利用层序遍历找到右视图。

代码:

class Solution {
public:
        vector<int> rightSideView(TreeNode* root) {

        unordered_map<int ,int>rightview;
        int maxdepth = -1;

        queue<TreeNode*>tree;
        queue<int>treedepth;

        tree.push(root);
        treedepth.push(0);

        while(!tree.empty()) {
            TreeNode* node = tree.front();
            tree.pop();
            int depth = treedepth.front();
            treedepth.pop();

            if(node != NULL) {
                maxdepth = max(maxdepth , depth);
                // 层序遍历最后访问的节点便是每一层的最右节点,因此不断更新即可
                rightview[depth] = node -> val;
                // 因为是栈结构,所以左子树先入栈,但是先访问的都是右子树
                tree.push(node -> left);
                tree.push(node -> right);
                treedepth.push(depth + 1);
                treedepth.push(depth + 1);
            }
        }

        vector<int>rightviewans;
        for(int i = 0;i <= maxdepth ;i++) {
            rightviewans.push_back(rightview[i]);
        }

        return rightviewans;
    }
    
    TreeNode* built(vector<int>& preorder, int pl ,int pr ,vector<int>& inorder , int inl ,int  inr ,map<int , int>& inorder_index) {
        if(pl > pr || inl > inr)
            return nullptr;
        // 如果是单独一个节点
        if(pl == pr || inl == inr)
            return new TreeNode(preorder[pl]);
        
        // 前序遍历第一个节点是根节点
        TreeNode* root = new TreeNode(preorder[pl]);
        
        // 找到中序遍历中对应节点的下标
        int index = inorder_index[preorder[pl]];
        
        // 生成左子树
        int leftsize = index - inl;
        root -> left = built(preorder, pl + 1, pl + leftsize, inorder, inl, index - 1, inorder_index);
        // 生成右子树
        root -> right = built(preorder, pl + leftsize + 1, pr, inorder, index + 1, inr, inorder_index);
        
        return root;
    }
    vector<int> solve(vector<int>& preorder, vector<int>& inorder) {
        map<int ,int>inorder_index;
        vector<int> ans;
        if(preorder.size() == 0 || inorder.size() == 0)
            return ans;
        // 构建中序遍历值和下标的映射
        for(int i = 0;i < inorder.size();i++)
            inorder_index.insert(pair<int, int>(inorder[i] , i));
        // 构建二叉树
        TreeNode* root = built(preorder , 0 , preorder.size() - 1, inorder , 0 ,inorder.size() - 1 , inorder_index);
        
        // 构造右视图
        return rightSideView(root);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值