二叉树中和为某一值的路径(Python and C++解法)

题目:

  输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:
给定如下二叉树,以及目标和 sum = 22,

        5
       / \
      4  8
     /    / \
   11 13 4
   / \      / \
  7 2    5 1
返回:

[
[5,4,11,2],
[5,8,4,5]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof

思路:

  路径肯定包括根节点,因此遍历节点时应该保证先遍历根节点,前序遍历符合要求。

  需要有列表记录下遍历过的路径。

  Python中赋值语句总是建立对象的引用值,而不是复制对象,所以如果直接res.append(path),当后面改变path内容时,res里的path会随之改变,因此可以使用浅拷贝,复制一个对象,方法如path[:],或list(path)

Python解法:

 1 class TreeNode:
 2     def __init__(self, x):
 3         self.val = x
 4         self.left = None
 5         self.right = None
 6 
 7 
 8 class Solution:
 9     def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
10         res = []  # 存储所有正确的路径
11         path = []  # 存储当前路径
12 
13         def dfs(fatherNode, sumPath):
14             if fatherNode == None:  # 递归终止条件
15                 return
16             path.append(fatherNode.val)  # 每条路径都有根节点
17             sumPath -= fatherNode.val
18             # 路径满足的条件是sum减为零,且已到达叶节点
19             if sumPath == 0 and fatherNode.left == None and fatherNode.right == None:
20                 res.append(list(path))
21             dfs(fatherNode.left, sumPath)  # 递归判断左子树是否有符合的路径
22             dfs(fatherNode.right, sumPath)  # 递归判断右子树是否有符合的路径
23             # 如果到某一叶节点的路径不符合要求,那么应return回溯到上一层,删除该叶节点,sum也随着回溯处于上一层的数值
24             path.pop()  # 当前的函数结束后才能pop叶节点
25         dfs(root, sum)  # 函数调用
26         return res

C++解法:

 1 struct TreeNode {
 2     int val;
 3     TreeNode *left;
 4     TreeNode *right;
 5     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 6 };
 7 
 8 class Solution {
 9 public:
10     vector<vector<int>> res;  // 存储最终结果
11     vector<int> path;
12     vector<vector<int>> pathSum(TreeNode* root, int sum) {
13         dfs(root, sum);
14         return res;
15     }
16 
17     void dfs(TreeNode *root, int sum) {
18         if (root == NULL)    return;  // 递归终止条件
19         path.push_back(root->val);  // 路径肯定要添加进根节点
20         sum -= root->val;
21         // 路径满足的条件是sum减为零,且已到达叶节点
22         if (sum == 0 && root->left == NULL && root->right == NULL)
23             res.push_back(path);
24         dfs(root->left, sum);  // 递归判断左子树是否有符合的路径
25         dfs(root->right, sum);  // 递归判断右子树是否有符合的路径
26         // 如果到某一叶节点的路径不符合要求,那么应return回溯到上一层,删除该叶节点,sum也随着回溯处于上一层的数值
27         path.pop_back();  // 当前的函数结束后才能pop叶节点
28     }
29 };
posted @ 2020-07-10 10:47  孔子?孟子?小柱子!  阅读(238)  评论(0编辑  收藏  举报