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

题目

输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。

牛客网 OJ
AcWing

C++ 题解

通过上图可以总结出规律:

  • 当用前序遍历的方式访问到某一结点时,我们把该结点添加到路径上,并累加该结点的值。
  • 如果该结点为叶结点并且路径中结点值的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。
  • 当前结点访问结束后,递归函数将自动回到它的父结点。这里要注意的是:在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到父结点的路径。
/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        
        vector<vector<int> > res;
        vector<int> path;
        
        if(root != nullptr)
            dfs(root,expectNumber,res,path);
       
        return res;
    }
    
    // 注意此处传入的是引用
    void dfs(TreeNode* root,int expectNumber,vector<vector<int> >& res,vector<int>& path)
    {
        path.push_back(root->val);
        // 如果是叶节点,并且值满足期待的值则找到了一条路径
        if(root->val == expectNumber && root->left == nullptr && root->right == nullptr)
        {
            res.push_back(path);
        }
        
        // 左子树,右子树分别查找,注意传递进去的目标值为差值
        if(root->left != nullptr)
        {
            dfs(root->left,expectNumber - root->val, res,path);
        }
        if(root->right != nullptr)
        {
            dfs(root->right,expectNumber - root->val, res,path);
        }
        
        // 节点回退
        path.pop_back();        
    }
    
};

python 题解

# -*- 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
        if not root:
            return []
        result=[]
        
        def FindPathCore(root,path,currentNum):
            currentNum += root.val
            path.append(root)
            # 判断是否达到叶子节点
            flag = (root.left==None and root.right==None)
            
            #如果到达叶子节点且当前值等于期望值
            if currentNum==expectNumber and flag:
                onepath=[]
                for node in path:
                    onepath.append(node.val)
                result.append(onepath)
            
            # 这一句判断很重要,能够加速查找
            if currentNum<expectNumber:
                if root.left:
                    FindPathCore(root.left,path,currentNum)
                if root.right:
                    FindPathCore(root.right,path,currentNum)
                    
            path.pop()
            currentNum -= root.val
                
        FindPathCore(root,[],0)
        return result
posted @ 2019-01-30 21:38  youngliu91  阅读(118)  评论(0编辑  收藏  举报