您的位置:首页 > 其它

二叉树的所有路径

2016-04-18 13:29 337 查看
题目描述:给一棵二叉树,找出从根节点到叶子节点的所有路径。

样例:



递归 + 深搜的思路。还记得之前学过的用递归的方法解决二叉树的前序遍历的问题吗?点击打开链接,用的就是深搜的策略,递归实现。我们在这里,依然用这种逻辑

基本解法可以这样描述:从根节点出发找叶子,找到叶子之后,所有这条“找寻之路”上的所有节点构成了我们要打印出来的一条路径。所以,我们需要建立一个全局变量path,存储未到达当前节点时扫描过的路径中有哪些节点,作为从当前节点起,往叶子遍历所经过的路径的前缀。同理,最后的结果列表也是一个全局变量了。

所以,当LintCode中给出的函数形参只有一个root时,我们就需要再设定一个辅助函数,包含刚才说的path和result,让他们两个成为全局变量。

总结一下思路:

1. 建立一个字符串变量path和结果列表result,初始化为空

2. 从根节点开始访问,之后访问其左子树,再访问其右子树

3. 每访问一个节点,将节点的值加入path,例如,访问完根节点后,path = "1 ->",并将这里的path作为新的变量加入左右子树的遍历函数

4. 递归“触底”的条件:访问的节点为空

讲的不是很清楚,对照代码看一下吧

"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
"""
class Solution:
# @param {TreeNode} root the root of the binary tree
# @return {List[str]} all root-to-leaf paths
def binaryTreePaths(self, root):
# 建立两个全局变量
path = ""
result = []
# 另建一个helper函数,方便对全局变量path,result的使用
self.helper(root, path, result)
return result

# void型函数,给结果列表result中添加由path为前缀的所有路径
def helper(self, root, path, result):

if root is None:
return
path = path + str(root.val)

# 递归对左孩子求路径
if root.left:
self.helper(root.left, path + "->", result)
# 递归对右孩子求路径
if root.right:
self.helper(root.right, path + "->", result)
# 如果是叶子,加入result
if root.left is None and root.right is None:
result.append(path)
# Write your code here
需要注意的是第33行,当当前访问的节点为叶子的时候,才将path加入结果列表。

这里是典型的递归,helper函数求的就是以参量root为根节点,path为路径前缀(也就是到达这个节点之前经过的路径)的子树的所有路径,我们只需要考虑递归“触底”的条件(root为空)和递归“升级”的条件(先用path加,再加左子树所有路径,再加右子树所有路径,如果左右子树都为空,也就是叶子了,就直接加入结果列表)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 深搜 递归