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
网友评论