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
    
  • 相关阅读:
    快速得到栈、队列的最大值
    原型与原型链
    人家跟你谈生意,你连份明码标价的菜单都拿不出来,有什么资格好撒气的?
    一个坑:java.sql.ResultSet.getInt==》the column value; if the value is SQL NULL, the value returned is 0
    static在实例Extends、Overload中理解
    JVM-ClassLoader(转)
    关于eclipse和javac编译结果不一致的问题的分析与解决 (转)
    蜗牛—JSP学习之JavaBean初识
    ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解
    关于64位Linux配置android开发环境出现 No such file or directory
  • 原文地址:https://www.cnblogs.com/wwj99/p/12251845.html
Copyright © 2011-2022 走看看