使用 Python 判断二叉树的指定垂直层是否已排序


假设我们有一个二叉树,我们需要检查二叉树的给定垂直层是否已排序。当两个节点重叠时,检查它们在其所属层级中是否按排序顺序排列。

因此,如果输入类似于 l = -1

则输出将为 True,因为 -1 层级的元素为 3、7,它们已排序。

为了解决这个问题,我们将遵循以下步骤:

  • 如果根节点为空,则

    • 返回 True

  • previous_value := -inf

  • current_level := 0

  • current_node := 一个值为 0 的新树节点

  • 定义一个名为 q 的双端队列

  • 将 (root, 0) 插入 q 的末尾

  • 当 q 不为空时,执行以下操作:

    • current_node := q[0, 0]

    • current_level := q[0, 1]

    • 从 q 的左侧删除元素

    • 如果 current_level 与 level 相同,则

      • 如果 previous_value <= current_node.val,则

        • previous_value := current_node.val

      • 否则,

        • 返回 False

    • 如果 current_node.left 不为空,则

      • 将 (current_node.left, current_level - 1) 插入 q 的末尾

    • 如果 current_node.right 不为空,则

      • 将 (current_node.right, current_level + 1) 插入 q 的末尾

  • 返回 True

示例

让我们看一下以下实现以更好地理解:

 在线演示

from collections import deque
from sys import maxsize
INT_MIN = -maxsize
class TreeNode:
   def __init__(self, key):
      self.val = key
      self.left = None
      self.right = None
def are_elements_sorted(root, level):
   if root is None:
      return True
   previous_value = INT_MIN
   current_level = 0
   current_node = TreeNode(0)
   q = deque()
   q.append((root, 0))
   while q:
      current_node = q[0][0]
      current_level = q[0][1]
      q.popleft()
      if current_level == level:
         if previous_value <= current_node.val:
            previous_value = current_node.val
         else:
            return False
      if current_node.left:
         q.append((current_node.left, current_level - 1))
      if current_node.right:
         q.append((current_node.right, current_level + 1))
   return True
root = TreeNode(2)
root.left = TreeNode(3)
root.right = TreeNode(6)
root.left.left = TreeNode(8)
root.left.right = TreeNode(5)
root.left.right.left = TreeNode(7)
level = -1
print(are_elements_sorted(root, level))

输入

root = TreeNode(2) root.left = TreeNode(3) root.right = TreeNode(6)
root.left.left = TreeNode(8) root.left.right = TreeNode(5)
root.left.right.left = TreeNode(7)

输出

True

更新于: 2020-08-25

53 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告

© . All rights reserved.