zoukankan      html  css  js  c++  java
  • [LeetCode] 366. Find Leaves of Binary Tree 找二叉树的叶节点

    Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps until the tree is empty.

    Example:
    Given binary tree 

              1
             / 
            2   3
           /      
          4   5    
    

    Returns [4, 5, 3], [2], [1].

    Explanation:

    1. Remove the leaves [4, 5, 3] from the tree

              1
             / 
            2          
    

    2. Remove the leaf [2] from the tree

              1          
    

    3. Remove the leaf [1] from the tree

              []         
    

    Returns [4, 5, 3], [2], [1].

    Credits:
    Special thanks to @elmirap for adding this problem and creating all test cases.

    给一个二叉树,找出它的叶节点然后删除,重复此步骤,直到二叉树为空。

    The key to solve this problem is converting the problem to be finding the index of the element in the result list. Then this is a typical DFS problem on trees.

    Java:

    public List<List<Integer>> findLeaves(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        helper(result, root);
        return result;
    }
     
    // traverse the tree bottom-up recursively
    private int helper(List<List<Integer>> list, TreeNode root){
        if(root==null)
            return -1;
     
        int left = helper(list, root.left);
        int right = helper(list, root.right);
        int curr = Math.max(left, right)+1;
     
        // the first time this code is reached is when curr==0,
        //since the tree is bottom-up processed.
        if(list.size()<=curr){
            list.add(new ArrayList<Integer>());
        }
     
        list.get(curr).add(root.val);
     
        return curr;
    } 

    Python:

    class Solution(object):
        def findLeaves(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            def findLeavesHelper(node, result):
                if not node:
                    return -1
                level = 1 + max(findLeavesHelper(node.left, result), 
                                findLeavesHelper(node.right, result))
                if len(result) < level + 1:
                    result.append([])
                result[level].append(node.val)
                return level
    
            result = []
            findLeavesHelper(root, result)
            return result
    

    C++:

    // Time:  O(n)
    // Space: O(h)
    
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<vector<int>> findLeaves(TreeNode* root) {
            vector<vector<int>> result;
            findLeavesHelper(root, &result);
            return result;
        }
    
    private:
        int findLeavesHelper(TreeNode *node, vector<vector<int>> *result) {
            if (node == nullptr) {
                return -1;
            }
            const int level = 1 + max(findLeavesHelper(node->left, result),
                                      findLeavesHelper(node->right, result));
            if (result->size() < level + 1){
                result->emplace_back();
            }
            (*result)[level].emplace_back(node->val);
            return level;
        }
    };
    

       

    类似题目:

    [LeetCode] 104. Maximum Depth of Binary Tree 二叉树的最大深度

    [LeetCode] 310. Minimum Height Trees 最小高度树

    [LeetCode] 545. Boundary of Binary Tree 二叉树的边界

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    事件优先权hdu1873(看病要排队)
    项目包ExpressJS入门指南
    按钮页面ActivityGroup实现Tab效果
    分割范围Codeforces Round #181 (Div. 2)
    随机伪随机随机数字
    数组最小剑指Offer读书笔记之第五章优化时间空间效率
    列字段通用excel导入修改版
    图片区域帧差法识别物体_matlab
    宋体关闭完美退出应用程序
    生成树最小生成树poj 1258 prim
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9583763.html
Copyright © 2011-2022 走看看