题目:
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
For example:Given the below binary tree and
sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
return true, as there exist a root-to-leaf path 5->4->11->2
which sum is 22.
题意:
给定一棵二叉树和一个给定的值,写一个函数,判断该二叉树中是否存在路径和为该值的路径
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def findpath(self, root, count, t_list, sum): #定义了一个子函数,用于深度遍历的递归
count += root.val
if root.left == None and root.right == None : #递归出口
if count == sum :
return t_list.append(1) #标记该条路径的路径和是否满足给定的值,如果是,标记为1,否则为0
else :
return t_list.append(0)
else :
if root.left != None :
tl_count = copy.deepcopy(count) #深度优先遍历中的深拷贝
self.findpath(root.left, tl_count, t_list, sum)
if root.right != None :
tr_count = copy.deepcopy(count)
self.findpath(root.right, tr_count, t_list, sum)
def hasPathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: bool
"""
if root == None :
return False
else :
count = 0 #计算路径和
t_list = [] #标记所有路径和中是否存在与给定值相等的路径存在
self.findpath(root, count, t_list, sum)
if 1 in t_list :
return True
else :
return False
笔记:
上面算法的效率并不高,因为是在计算完所有的路径后,再判断是否有满足条件的路径存在。
如果在计算过程中,发现当前路径和已经大于给定值sum,是否可以提前退出该条路径的搜索?
如果找到了一条满足条件的路径存在,能否直接返回True,不用再继续遍历其他路径?
由于在函数findpath里面,不会区分跳出递归的return和跳出整个函数的return,故上面两点无法实现,导致算法效率提不高。
递归这部分,还有待继续学习。