1038. 从二叉搜索树到更大和树
思路
关键点在于二叉搜索树的有序性,并且要选择好遍历的顺序与处理节点的时机。
利用二叉搜索树的右子树大于根的特性,以右 根 左的顺序遍历并累记节点上的值的和,因为题目的要求是大于等于当前结点值的所有结点值的和,所以要先把当前结点的值加上,再把累记的和赋值当前结点。
技术总结
- python中没有null,判断一个变量是否为空用is None
- 在python中嵌套函数想调用母函数的局部变量,要声明nonlocal关键字
代码
class Solution:
def bstToGst(self, root: TreeNode) -> TreeNode:
c = 0
def travel(node):
if node.right is not None:
travel(node.right)
nonlocal c
c += node.val
node.val = c
if node.left is not None:
travel(node.left)
travel(root)
return root
889. 根据前序和后序遍历构造二叉树
思路
大问题拆解为小问题,递归解决问题。
对于一对先序+后序的处理,根据先序 根左右, 后序 左右根的特点,可以知道先序的第一个值是结点的值。结点的左右子树我们可以用递归的方式处理。
之后我们想要将左右子树的前序和后序划分出来,左子树的先序又可分为 左根,左左,右,在左子树的后序可分为左左,左右,左根;由此,可以知道左根的值是原树的前序中的第二个值,知道左根的值后,就可以在原树的后序中查找左根的位置并进一步知道左部分的长度,之后就可以得出左,右两个部分的前序和后序的子序列了。
技术总结
- 注意数组下标不要越界,访问结点前要检查是否为空
- python截取的list的形式为 list[a:b],注意用的是冒号
- 字符串到数字int('12') 数字到字符串 str(18)
代码
class Solution:
def constructFromPrePost(
self, preorder: List[int], postorder: List[int]
) -> TreeNode:
# 建树
def build(pre, post):
node = TreeNode()
print(pre)
print(post)
if len(pre) == 0:
return None
if pre[0] == post[len(post) - 1]:
node.val = pre[0]
if len(pre) == 1:
return node
x = pre[1]
y = post.index(x)
left_pre = pre[1 : y + 2]
left_post = post[0 : y + 1]
node.left = build(left_pre, left_post)
if node.left is not None:
print(str(node.val) + " left is " + str(node.left.val))
right_pre = pre[y + 2 :]
right_post = post[y + 1 : -1]
node.right = build(right_pre, right_post)
if node.right is not None:
print(str(node.val) + " right is " + str(node.right.val))
print("-----------------------------")
return node
root = build(preorder, postorder)
return root