【力扣】366.寻找二叉树的叶子节点 <树>

【力扣】366.寻找二叉树的叶子节点

给你一棵二叉树,请按以下要求的顺序收集它的全部节点:

  • 依次从左到右,每次收集并删除所有的叶子节点
  • 重复如上过程直到整棵树为空

示例:
输入: [1,2,3,4,5]

      1
     / \
    2   3
   / \     
  4   5    

输出: [[4,5,3],[2],[1]]

解释:

  1. 删除叶子节点 [4,5,3] ,得到如下树结构:

       1
      / 
     2          
    
  2. 现在删去叶子节点 [2] ,得到如下树结构:

       1          
    
  3. 现在删去叶子节点 [1] ,得到空树:

       []         
    

题解

  • 找叶子节点,并删除叶子节点
import java.util.*;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

class Solution {
    public List<List<Integer>> findLeaves(TreeNode root) {
        List<List<Integer>> resultList = new ArrayList<>();

        //树不为空
        while (root != null) {
            //每一级树叶子节点
            List eachList = new ArrayList<>();
            //更新树和 当前层叶子结点list
            root = recur(root, eachList);

            resultList.add(eachList);
        }

        return resultList;
    }

    //递归先序遍历
    private TreeNode recur(TreeNode root, List<Integer> list) {
        // 边界
        if (root == null) {
            return null;
        }

        // 如果 root 是叶子节点,则把它装入到 list 中,并且给上一级返回 null,表示自己被删除
        if (root.left == null && root.right == null) {
            list.add(root.val);
            return null;
        }

        // 如果 root 不是叶子节点,则递归 root 的左子节点和右子节点,并返回 root 给上一级,表明自己没有被删除
        root.left = recur(root.left, list);
        root.right = recur(root.right, list);

        //返回 node 给上一级调用,即告诉上一级,node 不是叶子节点,当前没删除
        return root;
    }
}

你可能感兴趣的:(Java相关,#,力扣及OJ,leetcode,算法,职场和发展)