面试题25_二叉树中和为某一值的路径

本文介绍了一种通过先序遍历的方法,在二叉树中查找所有结点之和等于给定整数的路径。详细阐述了算法实现步骤,包括路径的构建与更新、累加和的计算以及返回条件的判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述


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


解题思路

当用先序遍历的方式访问某一结点时候,我们把该结点加入到当前路径,并计算累加和。

若累加和刚好等于输入的整数,并且该节点为叶子节点,那么当前路径符合要求。

如果当前节点不是叶子节点,那么继续访问它的子节点。

当前节点访问结束后,递归地返回到它的父节点。

注意:在退出当前路径的时候,要在当前路径中删除当前节点,以确保返回父节点时,路径刚好是从根节点到父节点的路径。累加和也要减去当前节点的值。


实现代码

/*
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>> ansPath;
        vector<int> curPath;
        if(root == nullptr)
            return ansPath;
        int curNum = 0;
        
        findAPath(root,ansPath,curPath,expectNumber,curNum);
        
        return ansPath;

    }
    //注意用引用传递参数
    void findAPath(TreeNode* root,vector<vector<int> > &ansPath,vector<int> &curPath, int expNum, int curNum)
    {
        curNum += root->val;//累加
        
        curPath.push_back(root->val);//把当前节点入栈
        
        bool isLeaf = (root->left == nullptr) && (root->right == nullptr);
        
        if(isLeaf && curNum == expNum)
        {
        	ansPath.push_back(curPath);//找到就压栈
        }
        
        if(root->left != nullptr)
            findAPath(root->left, ansPath, curPath, expNum, curNum);
        
        if(root->right != nullptr)
            findAPath(root->right, ansPath, curPath, expNum, curNum);
        
        curNum -= root->val;//回到上一个节点 要减去当前节点的值
        curPath.pop_back();//在返回到父节点之前,要删除当前节点
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值