zoukankan      html  css  js  c++  java
  • LeetCode——199. 二叉树的右视图

    给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

    示例:
    
    输入: [1,2,3,null,5,null,4]
    输出: [1, 3, 4]
    解释:
    
       1            <---
     /   
    2     3         <---
          
      5     4       <---
    

    https://leetcode-cn.com/problems/binary-tree-right-side-view/

    递归 DFS

    递归方法是分别遍历一个节点的右节点和左节点,因为是从右边看过来,所以我们需要首先遍历右节点。

    这里有个疑问,当遍历左节点时候,怎么判定它右边没有其他节点了呢?

    这里我们用到一个变量level,对于同一层的节点,如果res数组的大小已经等于level了,说明右边已经有节点存入数组了,该节点就不用再保存。一直递归下去就可以得到结果。

    C++

    class Solution {
    public:
        vector<int> rightSideView(TreeNode* root) {
            vector<int> res;
            helper(root,0,res);
            return res;        
        }
        void helper(TreeNode* root,int level,vector<int>& res){
            if(!root) return;
            if(res.size()==level) res.push_back(root->val);
            helper(root->right,level+1,res);
            helper(root->left,level+1,res);
        }
    };
    

    非递归 BFS

    这道题要求我们打印出二叉树每一行最右边的一个数字,实际上是求二叉树层序遍历的一种变形,我们只需要保存每一层最右边的数字即可,还是需要用到数据结构队列queue,遍历每层的节点时,把下一层的节点都存入到queue中,每当开始新一层节点的遍历之前,先把新一层最后一个节点值存到结果中,代码如下:

    C++

    class Solution {
    public:
        vector<int> rightSideView(TreeNode* root) {
            vector<int> res;
            if(!root) return res;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                res.push_back(q.back()->val);
                int size = q.size();
                for(int i=0; i<size; ++i){
                    TreeNode* t=q.front(); q.pop();
                    if(t->left) q.push(t->left);
                    if(t->right) q.push(t->right);
                }           
            }
            return res;
        }
    };
    

    java

    class Solution {
    	public List<Integer> rightSideView(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            List<Integer> ret = new ArrayList<>();
            while (!queue.isEmpty()) {
                int size = queue.size();
                for (int i = 0; i < size; i++) {
                    TreeNode node = queue.poll();
                    if (i == size - 1) {
                        ret.add(node.val);
                    }
                    if (node.left != null) {
                        queue.add(node.left);
                    }
                    if (node.right !=null) {
                        queue.add(node.right);
                    }
                }
            }
            return ret;
        }
    }
    

    python

    class Solution:
        def rightSideView(self, root: TreeNode) -> List[int]:
            if not root: return []
            res = []
    
            def bfs(root):
                queue = [root]
                while queue:
                    nxt = []
                    res.append(queue[-1].val)
                    for node in queue:
                        if node.left:
                            nxt.append(node.left)
                        if node.right:
                            nxt.append(node.right)
                    queue = nxt
            
            bfs(root)
            return res
    
  • 相关阅读:
    无题
    生活真像小说
    草样年华
    Intentional Programming
    厌倦说话
    解释 Intentional Programming
    开始折腾iphone cdma 恢复,降级,刷机,越狱,手编,写号
    新手如何成为更好的图形设计师
    Grunt.js 初使用
    有抱负的程序员应看的10个TED演讲
  • 原文地址:https://www.cnblogs.com/wwj99/p/12251845.html
Copyright © 2011-2022 走看看