leetcode日志2022.6.5

1038. 从二叉搜索树到更大和树

思路

关键点在于二叉搜索树的有序性,并且要选择好遍历的顺序与处理节点的时机。

利用二叉搜索树的右子树大于根的特性,以右 根 左的顺序遍历并累记节点上的值的和,因为题目的要求是大于等于当前结点值的所有结点值的和,所以要先把当前结点的值加上,再把累记的和赋值当前结点。

技术总结

  1. python中没有null,判断一个变量是否为空用is None
  2. 在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. 根据前序和后序遍历构造二叉树

思路

大问题拆解为小问题,递归解决问题。

对于一对先序+后序的处理,根据先序 根左右, 后序 左右根的特点,可以知道先序的第一个值是结点的值。结点的左右子树我们可以用递归的方式处理。

之后我们想要将左右子树的前序和后序划分出来,左子树的先序又可分为 左根,左左,右,在左子树的后序可分为左左,左右,左根;由此,可以知道左根的值是原树的前序中的第二个值,知道左根的值后,就可以在原树的后序中查找左根的位置并进一步知道左部分的长度,之后就可以得出左,右两个部分的前序和后序的子序列了。

 

技术总结

  1. 注意数组下标不要越界,访问结点前要检查是否为空
  2. python截取的list的形式为 list[a:b],注意用的是冒号
  3. 字符串到数字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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值