【剑指offer】二叉树中和为某一值的路径(回溯法)【python】

题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:
暴力遍历二叉树每一个节点,采用递归回溯的思想。建立一个全局的results数组保存所有结果的信息,如果遍历到了叶子节点并且和正好为expect,那么将此时的数组加入到results中
采用回溯的思想:每次递归的时候,使用一个Result数组保存当前数组,不管递归成功或者失败,递归结束之后,都需要回溯到Result数组


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    def __init__(self):
        self.results = []
    def Sum(self, result):
        sum = 0
        for i in result:
            sum += i
        return sum
    # 返回二维列表,内部每个列表表示找到的路径
    def FindPathCore(self, root, expectNumber, result):
        result.append(root.val)
        Result = result[:]
        if self.Sum(result) == expectNumber and root.left == None and root.right == None:
            self.results.append(result)
        if root.left:
            self.FindPathCore(root.left, expectNumber, result)
            result = Result
        if root.right:
            self.FindPathCore(root.right, expectNumber, result)
    def BubbleSort(self, results):#冒泡排序将results变为又大到小
        for i in range(len(results)):
            for j in range(len(results) - 1, i, -1):
                if len(results[j]) > len(results[i]):
                    results[i], results[j] = results[j], results[i]
    def FindPath(self, root, expectNumber):
        # write code here
        if root == None:
            return []
        self.FindPathCore(root, expectNumber, [])
        self.BubbleSort(self.results)
        return self.results

改进算法:

class Solution:
    def __init__(self):
        self.results = []
    def RecursionFindPath(self, root, expectNumber, result):
        result.append(root.val)
        if root.left == None and root.right == None and sum(result) == expectNumber:
            self.results.append(result)
        temp = result[:]
        if root.left:
            self.RecursionFindPath(root.left, expectNumber, result)
        result = temp[:]
        if root.right:
            self.RecursionFindPath(root.right, expectNumber, result)
    def FindPath(self, root, expectNumber):
        if root == None:
            return []
        self.RecursionFindPath(root, expectNumber, [])
        self.results = sorted(self.results, key=len, reverse=True)
        return self.results

if __name__ == '__main__':
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.left.left = TreeNode(4)
    root.right = TreeNode(3)
    root.right.right = TreeNode(2)
    root.right.right.left = TreeNode(1)
    root.right.right.right = TreeNode(5)
    expectNum = 7
    print(Solution().FindPath(root, expectNum))
[[1, 3, 2, 1], [1, 2, 4]]
Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值