aiaiask.com©

开花即结果 提问即答案

定义一个二叉树为好二叉树
原始问题:

定义一个二叉树为好二叉树

一个好二叉树(good binary tree)满足以下条件:

  1. 每个节点的左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。
  2. 左子树和右子树都是好二叉树。
  3. 没有空节点(null节点)。
  4. 所有叶子节点(没有子节点的节点)的度数(子节点的数量)为0或1。

下面是一个示例的好二叉树的定义:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def is_good_binary_tree(root):
    if root is None:
        return True

    stack = [(root, False)]  # (node, is_left)

    while stack:
        node, is_left = stack.pop()

        if not is_left:  # 如果当前节点是父节点的右子节点,则将is_left设置为True
            is_left = True
        else:
            is_left = False

        if node.left is not None and not is_good_binary_tree(node.left):
            return False
        if node.right is not None and not is_good_binary_tree(node.right):
            return False

        if node.left is not None and node.right is not None:  # 如果当前节点不是叶子节点,检查左右子树是否满足条件
            if node.left.val >= node.val or node.right.val <= node.val:
                return False
        elif (node.left is not None and node.val > node.left.val + 1) or 
             (node.right is not None and node.val < node.right.val - 1):  # 如果当前节点是叶子节点,检查其度数是否为0或1
            return False
        
        stack.append((node, not is_left))  # 将当前节点及其方向压入栈中,以便后续处理
    
    return True

上述代码定义了一个TreeNode类来表示二叉树的节点,并实现了is_good_binary_tree函数来判断给定根节点的好二叉树性质。函数使用栈来辅助遍历二叉树,同时根据节点的位置确定其是父节点的左子树还是右子树。在遍历过程中,通过比较节点的值以及左右子树的条件来判断当前节点是否满足好二叉树的要求。如果遇到不满足条件的节点,立即返回False;否则,在遍历完成后返回True。

定义一个二叉树为好二叉树
https://www.aiaiask.com/ask/46101.html
AI / 模型Siliconflow
时间 / DATESeptember 6, 2023, 7:23 PM
语言zh-CN
IP / 区域天津市天津市