我是靠谱客的博主 故意朋友,最近开发中收集的这篇文章主要介绍python递归实现二叉树路径求和,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

该博客为学习笔记,记录学习心得,有错误的地方,一起探讨学习。

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。


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

该题可通过递归算法实现。在求解之前,我们先来看看递归算法本质,递归算法实现可总结为两部分:
1.重复步骤
2.执行函数
先来看看斐波那契数列实现

def Fibonacci(n):
  	if n <= 1: #执行函数
          return n
  	return Fibonacci(n-1) + Fibonacci(n-2) #重复步骤
 
 for i in range(1, 20):
    print(Fibonacci(i), end=' ')
#输出
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 

来看看Fibonacci(n)流程
f ( 5 ) = f ( 4 ) + f ( 3 ) f(5) =f(4)+f(3) f(5)=f(4)+f(3)
f ( 5 ) = f ( 3 ) + f ( 2 ) + f ( 2 ) + f ( 1 ) f(5) = f(3)+f(2)+f(2)+f(1) f(5)=f(3)+f(2)+f(2)+f(1)
注意根据执行函数的执行条件:
f ( 2 ) = f ( 1 ) f(2)=f(1) f(2)=f(1)
所以
f ( 5 ) = f ( 1 ) + f ( 1 ) + f ( 1 ) + f ( 1 ) + f ( 1 ) + f ( 1 ) = 5 f(5) = f(1)+f(1)+f(1)+f(1) +f(1)+f(1) = 5 f(5)=f(1)+f(1)+f(1)+f(1)+f(1)+f(1)=5

现在我们来分析怎么用递归解答二叉树路径求和问题:
第一,找到递归部分:二叉树的每个节点结构是相同的。如下,重复调用TreeNode

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

因此我们考虑递归遍历每个节点

def dfs(node, curr_sum, s, res):
            if node.left: #从节点左边开始遍历
                dfs(node.left, curr_sum + [node.left.val], s, res)
            if node.right:#从节点右边边开始遍历
                dfs(node.right, curr_sum + [node.right.val], s, res)

第二,执行函数:这里执行函数有两个:
第一个是递归遍历每个节点,并把节点值保存,不像Fibonacci需要遍历到f(1)才执行

 curr_sum + [node.left.val]
curr_sum + [node.right.val],

第二个是终止条件,遍历到叶子节点,停止遍历,判断是否满足求和条件,满足,则储存结果

if not node.left and not node.right and sum(curr_sum) == s :
		 res.append(curr_sum)

最后完整代码如下(参考leecode官网题解)

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def pathSum(self, root,s):
        if not root:
            return []
        def dfs(node, curr_sum, s, res):
            if not node.left and not node.right and sum(curr_sum) == s : 
                res.append(curr_sum)
            if node.left:
                dfs(node.left, curr_sum + [node.left.val], s, res)
            if node.right:
                dfs(node.right, curr_sum + [node.right.val], s, res)
        curr_sum, res = [], []
        dfs(root, [root.val], s, res)
        return res
#插入数据
root = TreeNode(5)
l1 = TreeNode(4)
r1 = TreeNode(8)
root.left = l1
root.right = r1
l2 = TreeNode(11)
r2 = TreeNode(13)
r3 = TreeNode(4)
l1.left = l2
r1.left = r2
r1.right = r3
l3 = TreeNode(7)
l4 = TreeNode(2)
r4 = TreeNode(5)
r5 = TreeNode(1)
l2.left = l3
l2.right = l4
r3.left = r4
r3.right = r5
solution = Solution()
t = solution.pathSum(root,22)
print(t)
#输出结果是:
[[5, 4, 11, 2], [5, 8, 4, 5]]

最后

以上就是故意朋友为你收集整理的python递归实现二叉树路径求和的全部内容,希望文章能够帮你解决python递归实现二叉树路径求和所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部