二叉树中和为某一值的路径

题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

思路:

本题是深度优先遍历的一个变形,通过遍历判断从根节点一直往下知道叶子结点所经过的结点和是否等于该整数。

注意:与二叉树的深度优先遍历不同的是,我们考虑的是由多个结点组成的路径,将其存储在列表中,在遍历过程中,不断向列表中添加元素,直到叶子结点,然后判断列表元素和

可用递归和非递归两种方法解决
递归

# -*- coding:utf-8 -*-
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    # 返回二维列表,内部每个列表表示找到的路径
    def FindPath(self, root, expectNumber):
        # write code here
        result=[]
        if not root:
            return result
        self.sum=expectNumber
        self.DFS(root, result, [root.val])
        return result

    def DFS(self, root, result, path):
        if not root.left and not root.right and sum(path) == self.sum:
            result.append(path)
        if root.left:
            self.DFS(root.left, result, path + [root.left.val])
        if root.right:
            self.DFS(root.right, result, path + [root.right.val])

A = TreeNode(1)
A1 = A.left = TreeNode(2)
A2 = A.right = TreeNode(3)
A1.left = TreeNode(4)
A1.right = TreeNode(5)
A2.left = TreeNode(6)
A2.right = TreeNode(7)

s = Solution()
print(s.FindPath(A,8))

非递归

# -*- coding:utf-8 -*-
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    # 返回二维列表,内部每个列表表示找到的路径
    def FindPath(self, root, expectNumber):
        # write code here
        result=[]
        if not root:
            return result
        queue = []
        queue.append((root,[root.val]))
        while queue:
            root,path = queue.pop(0)
            if not root.left and not root.right and sum(path)==expectNumber:
                #题目要求在返回值的list中,数组长度大的数组靠前,因为越往前插入符合条件的路径长度越小
                result.insert(0,path)
            if root.left:
                queue.append((root.left,path+[root.left.val]))
            if root.right:
                queue.append((root.right,path+[root.right.val]))
        return result
        
A = TreeNode(10)
A1 = A.left = TreeNode(12)
A2 = A.right = TreeNode(5)
A2.left = TreeNode(4)
A2.right = TreeNode(7)

s = Solution()
print(s.FindPath(A,22))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值