LeetCode-每日练习:最大二叉树

998. 最大二叉树 II

最大树 定义:一棵树,并满足:其中每个节点的值都大于其子树中的任何其他值。
给你最大树的根节点 root 和一个整数 val 。
就像 之前的问题 那样,给定的树是利用 Construct(a) 例程从列表 a(root = Construct(a))递归地构建的:
如果 a 为空,返回 null 。
否则,令 a[i] 作为 a 的最大元素。创建一个值为 a[i] 的根节点 root 。
root 的左子树将被构建为 Construct([a[0], a[1], ..., a[i - 1]]) 。
root 的右子树将被构建为 Construct([a[i + 1], a[i + 2], ..., a[a.length - 1]]) 。
返回 root 。
请注意,题目没有直接给出 a ,只是给出一个根节点 root = Construct(a) 。
假设 b 是 a 的副本,并在末尾附加值 val。题目数据保证 b 中的值互不相同。
返回 Construct(b) 。

  • 递归构造
# 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 insertIntoMaxTree(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        # 当原来的树为空
        if not root:
            return TreeNode(val)
        # 当插入的值比当前节点值大,根节点直接插入到val左子树上
        if root.val < val:
            node = TreeNode(val)
            node.left = root
            return node
        # 如果插入的值较小,则不断递归直到找到大于的节点,该节点变为此节点的左节点;或者遍历到底部,直接变为右节点
        root.right = self.insertIntoMaxTree(root.right, val)
        return root
  • 遍历法构造
class Solution:
    def insertIntoMaxTree(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        # 父节点,当前节点
        parent, cur = None, root
        # 遍历二叉树
        while cur:
            # 当插入值较大
            if val > cur.val:
                # 当插入值大于根节点,直接将原来的二叉树连接到插入值的左节点
                if not parent:
                    return TreeNode(val, root, None)
                # 当插入值大于部分节点值,先将插入值作为根节点
                node = TreeNode(val, cur, None)
                # 父节点更新
                parent.right = node
                return root
            # 当插入值较小,更新父节点
            else:
                parent = cur
                # 遍历右子树
                cur = cur.right
        # 当原先的树为空,直接构造一个单树
        parent.right = TreeNode(val)
        return root

你可能感兴趣的:(LeetCode-每日练习:最大二叉树)