二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 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())