LeetCode 剑指offer——二叉搜索树的后序遍历序列、二叉树中和为某一值的路径

这篇博客介绍了如何判断一个整数数组是否为二叉搜索树的后序遍历结果,以及如何找到二叉树中节点值之和等于特定值的路径。针对这两个问题,分别给出了递归解决方案,其中后序遍历的验证方法利用了二叉搜索树的性质,路径求解采用了回溯法。代码中时间复杂度和空间复杂度进行了分析,并强调了在路径存储时使用深拷贝避免影响后续遍历。
摘要由CSDN通过智能技术生成

二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3

示例1:

输入: [1,6,3,2,5]
输出: false

示例2:

输入: [1,3,2,6,5]
输出: true

代码:

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        def recur(pr):
            if len(pr) < 2: return True        
            root = pr[len(pr)-1]
            m = -1
            for i in range(len(pr)-1):
                if pr[i] > root:
                    m = i
                    break
            m = len(pr)-1 if m == -1 else m      #m是左右子树的分界,二叉搜索树种左子树都比root小,右子树都比root大
            for i in range(m, len(pr)-1):
                if pr[i] < root:
                    return False
            return recur(pr[0:m]) and recur(pr[m:len(pr)-1])

        return recur(postorder)

本题用递归实现,由于是二叉搜索树,左子树都比根节点小,右子树都比根节点大,同时后序遍历的根节点在尾部,按照这一规则进行遍历递归遍历。

时间复杂度O(n^2),空间复杂度O(n)。

二叉树中和为某一值的路径

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:
给定如下二叉树,以及目标和 sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1

返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

代码:

class Solution:
    def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
        res, path = [], []
        def recur(root, tar):
            if not root: return
            path.append(root.val)
            tar -= root.val
            if tar == 0 and not root.left and not root.right:
                res.append(list(path))
            recur(root.left, tar)
            recur(root.right, tar)
            path.pop()

        recur(root, sum)
        return res

本题用递归和回溯法解决,时间复杂度O(n),空间复杂度O(n)。

中间res.append(list(path))的地方,用list(path)而不直接append(path)的原因是为了深拷贝path,否则为浅拷贝。

(当然,list()只能对最外层列表进行深拷贝,如果是嵌套列表则里面的列表还是引用。如果要完全的深拷贝可用copy.deepcopy())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值