题目:二叉树根节点到叶子节点和为指定值的路径
描述:给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于 sum的路径,例如:给出如下的二叉树, sum=22,图如下所示:
返回[[5,4,11,2],[5,8,9]]。
解法一:
思路分析:首先,通读题目,通过理解相应题目,我们可以采用递归的方法去解决问题,如果递归的当前结点不是叶子结点,就把sum减去当前的值,并把当前结点当作路径添加到临时的数组当中去,然后去检查其左右结点,如果是叶子结点的话,检查其剩余的sum值是否与该值相等,如果相等就把最终结果放到最后的res容器当中去。
实例分析:输入为[5,4,8,1,11,#,9,#,#,2,7],Sum = 22。
首先定义一个res的容器,作为最终存放的结果。
存放的数值 | 5 | target = 22 - 5 = 17 |
遍历5的左子树 | 4 | target = 17 - 4 = 13 |
遍历4的左子树 | 1 | target = 13 - 1 = 12 |
因为已经到了叶子结点,计算的值不等于最终值,故返回上一层 | ||
遍历4的右子树 | 11 | target = 13 - 11 = 2 |
遍历11的左子树 | 2 | target = 2 - 2 = 0 |
将这次的计算结果返回到res容器当中,返回上一层 | ||
遍历11的右子树 | 7 | target = 2 - 7(不符合条件) |
返回上一层的上一层 | ||
遍历5的右子树 | 8 | target = 17 - 8 = 9 |
遍历8的右子树 | 9 | target = 9 - 9 = 0 |
将最终结果存放到res容器当中,结束运算 |
具体C++代码如下所示:
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ class Solution { public: /** * * @param root TreeNode类 * @param sum int整型 * @return int整型vector<>> */ vector res; vector pathSum(TreeNode* root, int sum) { // write code here vector path; run(sum, root, path);//定义一个run函数 return res; } void run(int target,TreeNode* node,vectorpath){ if(node == nullptr)//如果未空,则不进行计算 return ; path.push_back(node->val);//将根节点的值添加到容器当中 if(node->left == nullptr && node->right == nullptr){//如果没有左右节点 if(target == node->val)//进行目标值的判断 res.push_back(path); } else{ target -= node->val;//逐层递减,进行判断 run(target, node->left, path); run(target, node->right, path); } } };
因为如果有n个数据的话,就等执行n次才能得到最终结果,所以时间复杂度为O(N),空间复杂度为O(N)。
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # # # @param root TreeNode类 # @param sum int整型 # @return int整型二维数组 # class Solution: def pathSum(self , root , sum ): # write code here res = [] self.dfs(root, sum, [], res)#调用该函数 return res#返回该数组 def dfs(self, root, sum, temp, res): if not root:#特殊情况 return if not root.left and not root.right and sum == root.val: res.append(temp + [root.val])#将该值加入到数组当中去 return temp.append(root.val)#扩展进去 self.dfs(root.left, sum - root.val, temp, res)#递归执行 self.dfs(root.right, sum - root.val, temp, res) temp.pop()
解法二:
思路分析:同样,我们可以采用迭代法进行计算,首先按照先序遍历的特点,遍历树中的所有结点,在先序遍历中,要记录路径值,只要等于目标值的话,就将路径加入到最终的列表当中。
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # # # @param root TreeNode类 # @param sum int整型 # @return int整型二维数组 # class Solution: def pathSum(self , root , sum ): # write code here ress = []#用于存储最终结果 lujing = [] def repath(root, goil): if not root: return lujing.append(root.val)##将根节点的值添加 goil -= root.val if goil == 0 and not root.left and not root.right:#判断条件为该值是否为0或者左右子树是否为空 ress.append(list(lujing))#返回到最终的res容器中 repath(root.left, goil)#遍历左子树 repath(root.right, goil)#遍历右子树 lujing.pop() repath(root, sum) return ress因为采用先序遍历遍历树中全部的元素,所以其时间复杂度为O(N),需要额外的内存空间res和lujing,所以其时间复杂度为O(N)。