返回介绍

solution / 0300-0399 / 0366.Find Leaves of Binary Tree / README

发布于 2024-06-17 01:04:01 字数 4725 浏览 0 评论 0 收藏 0

366. 寻找二叉树的叶子节点

English Version

题目描述

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

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

 

示例:

输入: [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] ,得到空树:

      []     

解法

方法一

# Definition for a binary tree node.
# class TreeNode:
#   def __init__(self, val=0, left=None, right=None):
#     self.val = val
#     self.left = left
#     self.right = right
class Solution:
  def findLeaves(self, root: TreeNode) -> List[List[int]]:
    def dfs(root, prev, t):
      if root is None:
        return
      if root.left is None and root.right is None:
        t.append(root.val)
        if prev.left == root:
          prev.left = None
        else:
          prev.right = None
      dfs(root.left, root, t)
      dfs(root.right, root, t)

    res = []
    prev = TreeNode(left=root)
    while prev.left:
      t = []
      dfs(prev.left, prev, t)
      res.append(t)
    return res
/**
 * Definition for a binary tree node.
 * public 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>> res = new ArrayList<>();
    TreeNode prev = new TreeNode(0, root, null);
    while (prev.left != null) {
      List<Integer> t = new ArrayList<>();
      dfs(prev.left, prev, t);
      res.add(t);
    }
    return res;
  }

  private void dfs(TreeNode root, TreeNode prev, List<Integer> t) {
    if (root == null) {
      return;
    }
    if (root.left == null && root.right == null) {
      t.add(root.val);
      if (prev.left == root) {
        prev.left = null;
      } else {
        prev.right = null;
      }
    }
    dfs(root.left, root, t);
    dfs(root.right, root, t);
  }
}
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *   int val;
 *   TreeNode *left;
 *   TreeNode *right;
 *   TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *   TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *   TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
  vector<vector<int>> findLeaves(TreeNode* root) {
    vector<vector<int>> res;
    TreeNode* prev = new TreeNode(0, root, nullptr);
    while (prev->left) {
      vector<int> t;
      dfs(prev->left, prev, t);
      res.push_back(t);
    }
    return res;
  }

  void dfs(TreeNode* root, TreeNode* prev, vector<int>& t) {
    if (!root) return;
    if (!root->left && !root->right) {
      t.push_back(root->val);
      if (prev->left == root)
        prev->left = nullptr;
      else
        prev->right = nullptr;
    }
    dfs(root->left, root, t);
    dfs(root->right, root, t);
  }
};
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */
func findLeaves(root *TreeNode) [][]int {
  prev := &TreeNode{
    Val:   0,
    Left:  root,
    Right: nil,
  }
  var res [][]int
  for prev.Left != nil {
    var t []int
    dfs(prev.Left, prev, &t)
    res = append(res, t)
  }
  return res
}

func dfs(root, prev *TreeNode, t *[]int) {
  if root == nil {
    return
  }
  if root.Left == nil && root.Right == nil {
    *t = append(*t, root.Val)
    if prev.Left == root {
      prev.Left = nil
    } else {
      prev.Right = nil
    }
  }
  dfs(root.Left, root, t)
  dfs(root.Right, root, t)
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文