📜  门| GATE-CS-2017(套装1)|第 36 题(1)

📅  最后修改于: 2023-12-03 14:58:31.881000             🧑  作者: Mango

门| GATE-CS-2017(套装1)|第 36 题

本题是GATE-CS-2017(套装1)的第36题,是一道需要对二叉树进行操作的题目,需要完成以下任务:

  • 给定一个二叉树和一个整数k,找出该二叉树中所有深度为k的叶子节点。
  • 对找出的叶子节点,按其在树中自底向上的层级排序,输出叶子节点的值。

下面是本题的代码实现:

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

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

该算法的时间复杂度为O(N),其中N是二叉树中节点的数量。空间复杂度为O(N),因为需要存储深度为每个叶子节点的列表。

具体操作过程如下:

  • 定义一个函数findLeaves,参数为二叉树的根节点root。该函数主要的功能是查找深度为k的叶节点,并按照其在树中自底向上的层级排序。
  • 定义一个帮助函数helper,参数为节点root和结果列表res。该函数的功能是查找该节点所在的深度,并将该节点所在深度的叶子节点添加到结果列表res中。
  • 若节点为空,直接返回-1。
  • 分别递归遍历该节点的左右子节点,并分别获取它们的深度,将左右子节点深度的最大值+1赋值给该节点的深度。
  • 在根据该节点的深度添加该节点的值到res列表中,如果该节点深度的列表尚未被创建,则需要创建一个新列表。
  • 将该节点的左右子节点置为空。
  • 最后返回该节点的深度。

因为二叉树的遍历是递归进行的,所以算法的时间复杂度是O(N),空间复杂度是O(N)。