JZ82题: 判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
#直接递归
class Solution:
def hasPathSum(self , root: TreeNode, sum: int) -> bool:
# write code here
if not root:#root为空
return False
sum-=root.val
if not root.left and not root.right and sum==0:#何时可以
return True
return self.hasPathSum(root.left,sum) or self.hasPathSum(root.right,sum)
JZ34题:输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
#DFS 回溯法
class Solution:
def FindPath(self , root: TreeNode, target: int) -> List[List[int]]:
# write code here
res=[]
pa=[]
def dfs(root,tar):
if not root: return []#何时结束 当前节点为空,则直接返回
pa.append(root.val)
tar-=root.val
if not root.left and not root.right and tar==0:#当前为叶节点,且目前路径的和为target
res.append(pa[:])#这里是复制了一个 path 并加入到 res,而不是将 path 对象加入了 res
if root.left:
dfs(root.left,tar)
if root.right:
dfs(root.right,tar)
pa.pop()#向上回溯前,需要将当前节点从路径 path 中删除
dfs(root,target)#
return res
BM37题:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
知识点:二叉搜索树的中序遍历为 递增序列 即二叉搜索树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值 且这个二叉树中没有相同值的节点
解;#从根节点开始遍历/递归 祖先一定满足:大于等于p 小于等于q
class Solution:
def lowestCommonAncestor(self , root: TreeNode, p: int, q: int) -> int:
# write code here
if p>q: p,q=q,p # 保证q大一些
#写成递归
if root.val>q:#root大于大的q, 说明p,q都在root的左子树上
return self.lowestCommonAncestor(root.left,p,q)
elif root.val<p:#说明p,q都在root的右子树上
return self.lowestCommonAncestor(root.right,p,q)
elif p<=root.val<=q:
return root.val
#写成递归
#写成遍历
while root:
if root.val >q:
root = root.left
elif root.val < p:
root = root.right
else:
return root.val
#写成遍历
BM38 题:给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。 val值均不相同
class Solution:
def lowestCommonAncestor(self, root: TreeNode, o1: int, o2: int) -> int:
def dfs(root,o1,o2):
if not root:return None
if root.val==o1 or root.val==o2:#若该节点是第一个值为o1或o2的节点,则该节点是最近公共祖先
return root
# 继续 去左子树查找最近公共祖结点
left=dfs(root.left,o1,o2)
# 继续 去右子树查找最近公共祖结点
right=dfs(root.right,o1,o2)
#返回
if not left: return right#如果左子树无值,则最近公共祖先在右子树,
if not right: return left#否则,在右子树
return root#同时都不为空 说明o1,o2 分别在root的左右侧
return dfs(root,o1,o2).val
题:
#解:
考虑使用中序遍历访问树的各节点 cur ;并在访问每个节点时构建 cur 和前驱节点 pre 的引用指向;中序遍历完成后,最后构建头节点和尾节点的引用指向即可。