二叉树中存在路径等于给定值

题目:输入一个二叉树和一个整数,打印出二叉树中所有和给定整数值相等的路径。

分析:先画图

明白几点:

1)根据题意,我们是要遍历整个树才能确定所有符合条件的路径。显然应该从根节点出发,那么我们就应该采用先序遍历。这里遍历就采用递归更简单。

2)遍历完了后如何保存路径呢?这里我们是采用vector而不是stack因为遍历的时候从根节点打印。

每次遍历一个结点,就将其压栈,当前结点访问结束后,递归函数将自动回到父节点,因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值。

#include <iostream>
#include <vector>   //用vector而不用stack是因为vector便于从根节点开始打印
using namespace std;
struct BinaryTreeNode{
    int m_rootData;
    BinaryTreeNode* m_leftChildren;
    BinaryTreeNode* m_rightChildren;
};

void createTree(BinaryTreeNode *&Node)
{
    int ch;
    cin >> ch;
    if (ch == 100)                               //有木有更好的方法
        Node = NULL;                          //注意,当输入为100时候 结点为NULL,刚开始一直检查不出错误。
    else
    {
        Node = new BinaryTreeNode;
        if (!Node)
            return;
        Node->m_rootData =ch;         //将字符转化为int
        createTree(Node->m_leftChildren);
        createTree(Node->m_rightChildren);
    }
}

void FindPath(BinaryTreeNode*pNode, int value, int currentValue, vector<int>Vector);
void FindPath(BinaryTreeNode* pNode,int value)
{
    //1.容错性判断
    if (pNode == NULL || value == 0)
        return;
    //2.定义一个vector,vector是用来保存经过的路径,作用仅仅只是为了输出符合要求的路径
    vector<int> pathVector;
    int current_value = value;
    //3.递归只是用来先序遍历树的所有结点
    FindPath(pNode, value, current_value, pathVector);
}

void FindPath(BinaryTreeNode*pNode, int value, int currentValue,vector<int>Vector)
{
    Vector.push_back(pNode->m_rootData);
    currentValue  -= pNode->m_rootData;      //先序遍历,先根节点,下面的递归是左右子树
    if (currentValue == 0 && pNode->m_leftChildren == NULL&&pNode->m_rightChildren == NULL)//满足要求的路径条件
    {
        cout << "找到了:" << endl;
        for (vector<int>::iterator it = Vector.begin(); it != Vector.end(); ++it)
            cout << *it << "  ";
        cout << endl;
    }
    //下面的递归主要是为了遍历树结点,这里要和树非递归先序遍历别弄混了,树的非递归时要用到栈的。
    if (pNode->m_leftChildren)
        FindPath(pNode->m_leftChildren, value, currentValue,Vector);
    if (pNode->m_rightChildren)
        FindPath(pNode->m_rightChildren, value, currentValue,Vector);
    Vector.pop_back();      //要理解递归的过程,每个结点的值都会保存下来。函数退出的时候要删除当前结点的值
}

int _tmain(int argc, _TCHAR* argv[])
{
    BinaryTreeNode* BinTree;
    createTree(BinTree);
    FindPath(BinTree, 22);
    return 0;
}

结果:

二叉树中存在路径等于给定值,布布扣,bubuko.com

时间: 2024-12-15 06:59:56

二叉树中存在路径等于给定值的相关文章

从数组中选出和等于固定值的n个数(JavaScript实现)

现实生活中的问题,可能会抽象为这样一种数据模型: 从一个数组中挑选出几个数,让这几个数相加的和为指定的值. 大多数读者应该有过网购的经历,网购一般会有个凑单功能,假如读者买了70元的商品,但是必须满100元才能包邮,这时系统会自动推荐一些商品,加起来差不多就100块钱了. 系统如何确定推荐哪些商品呢?这其实就是刚刚提到的模型,我们可以把热销商品的价格放到一个数组中,然后利用算法,找出数组中哪些价格的和为30元. 废话少说,小菜给大家分享一个JavaScript版本的算法实现. 算法代码: 1 f

二叉树中的和,求路径

题目描述:已知二叉树和一个确定的值,求二叉树中的路径上节点的和满足给定的值,输出这些路径. 题目和算法解析:我们知道二叉树中的路径是指从根节点到叶子节点的.一定是从根节点出发的.所以我们需要有一种数据结构能够记录我们走过的路径.想到了栈.算法需要从根节点开始采用 前序遍历的思想逐个去校验是否符合条件. 算法实现: 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 typedef struct BiT

打印二叉树节点数值总和等于某个给定节点的所有路径

打印二叉树节点数值总和等于某个给定节点的所有路径,路径可以从任意节点开始,任意节点结束. 比如,假设和是8,树如下 的路径有  [[5,3],[8],[5,1,2]].  5  / \ 3     1 /\     /\ 4  8  2   6 思路:遍历所有路径,对于每一个节点,在其路径中向后寻找sum和为target的路径加入到结果中. public List<List<Integer>> findSum(TreeNode root,int sum){ List<List

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \         /   \ n6    n7    n8    n9 /                       / n10                

LeetCode(124):二叉树中的最大路径和

Hard! 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不需要经过根节点. 示例 1: 输入: [1,2,3] 1 / 2 3 输出: 6 示例 2: 输入: [-10,9,20,null,null,15,7]   -10    /   9  20     /     15   7 输出: 42 解题思路: 这道求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,像这种

[LeetCode] 124. 二叉树中的最大路径和

题目链接 : https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/ 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例: 示例 1: 输入: [1,2,3] 1 / 2 3 输出: 6 示例 2: 输入: [-10,9,20,null,null,15,7] -10 / 9 20 / 15 7 输出: 42 思路

leetcode:124. 二叉树中的最大路径和

题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] 1 / 2 3 输出: 6 示例 2: 输入: [-10,9,20,null,null,15,7]   -10    /   9  20     /     15   7 输出: 42 思路分析: 路径问题常规想到的就是用搜索解决.这道题用到了dfs,用递归完成.对于每个结点,计算其左右子树的贡献值,

图解leetcode —— 124. 二叉树中的最大路径和

前言: 每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] 1 / \ 2 3 输出: 6 示例 2: 输入: [-10,9,20,null,null,15,7] -10   / \  9  20    /  \   15   7 输出: 42 思路: java