zoukankan      html  css  js  c++  java
  • [LeetCode] 199. Binary Tree Right Side View 二叉树的右侧视图

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.

    Example:

    Input: [1,2,3,null,5,null,4]
    Output: [1, 3, 4]
    Explanation:
    
       1            <---
     /   
    2     3         <---
          
      5     4       <---
     
    给一个二叉树,想象你站在它的右边,返回你能看到的从上到下节点。实际上是二叉树层序遍历的一种变形,只需要保存每一层最右边的数字即可。
    解法1:DFS
    解法2:  BFS
     
    Java: 
    public class Solution {
        public List<Integer> rightSideView(TreeNode root) {
            List<Integer> result = new ArrayList<Integer>();
            rightView(root, result, 0);
            return result;
        }
        
        public void rightView(TreeNode curr, List<Integer> result, int currDepth){
            if(curr == null){
                return;
            }
            if(currDepth == result.size()){
                result.add(curr.val);
            }
            
            rightView(curr.right, result, currDepth + 1);
            rightView(curr.left, result, currDepth + 1);
            
        }
    }  

    Python: DFS 

    # Time:  O(n)
    # Space: O(h)
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    
    class Solution(object):
        # @param root, a tree node
        # @return a list of integers
        def rightSideView(self, root):
            result = []
            self.rightSideViewDFS(root, 1, result)
            return result
    
        def rightSideViewDFS(self, node, depth, result):
            if not node:
                return
    
            if depth > len(result):
                result.append(node.val)
    
            self.rightSideViewDFS(node.right, depth+1, result)
            self.rightSideViewDFS(node.left, depth+1, result)
    

    Python: BFS  

    # Time:  O(n)
    # Space: O(n)
    class Solution2(object):
        # @param root, a tree node
        # @return a list of integers
        def rightSideView(self, root):
            if root is None:
                return []
    
            result, current = [], [root]
            while current:
                next_level = []
                for node in current:
                    if node.left:
                        next_level.append(node.left)
                    if node.right:
                        next_level.append(node.right)                
                result.append(node.val)
                current = next_level
    
            return result
    

    Python: Compute the right view of both right and left left subtree, then combine them. For very unbalanced trees, this can be O(n^2), though.

    def rightSideView(self, root):
        if not root:
            return []
        right = self.rightSideView(root.right)
        left = self.rightSideView(root.left)
        return [root.val] + right + left[len(right):]
    

    Python: DFS-traverse the tree right-to-left, add values to the view whenever we first reach a new record depth. This is O(n).

    def rightSideView(self, root):
        def collect(node, depth):
            if node:
                if depth == len(view):
                    view.append(node.val)
                collect(node.right, depth+1)
                collect(node.left, depth+1)
        view = []
        collect(root, 0)
        return view 

    Python: Traverse the tree level by level and add the last value of each level to the view. This is O(n).

    def rightSideView(self, root):
        view = []
        if root:
            level = [root]
            while level:
                view += level[-1].val,
                level = [kid for node in level for kid in (node.left, node.right) if kid]
        return view  

    C++: DFS

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

    C++: BFS 

    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 *node = q.front();
                    q.pop();
                    if (node->left) q.push(node->left);
                    if (node->right) q.push(node->right);
                }
            }
            return res;
        }
    };
    

    类似题目:

    [LeetCode] 102. Binary Tree Level Order Traversal 二叉树层序遍历

    [LeetCode] 107. Binary Tree Level Order Traversal II 二叉树层序遍历 II

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    java9的JShell小工具和编译器两种自动优化
    运算符
    数据类型
    常量&&变量
    强化学习复习笔记
    强化学习复习笔记
    DQN算法原理详解
    语言模型评价指标Perplexity
    C++ STL标准容器插入删除算法的复杂度
    集束搜索beam search和贪心搜索greedy search
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9781542.html
Copyright © 2011-2022 走看看