【剑指Offer】二叉树中和为某一值的路径

问题描述

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

算法分析

  1. 如果 root 等于 输入数,将root放在返回数组里返回;如果root大于输入数,返回空值;

    如果root小于输入数,将root放在数组里,输入数自减root,一同随root的子树递归;

  2. 如果输入数为0了且左右子树都为空,即为叶子节点,则这条路径可行,返回数组;

    如果 root 没有子树了,同时输入数还没为0,说明此路不通,返回NULL。

代码实现

/*
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, intexpectNumber) {
        vector<vector<int> > result;
        if(root == NULL) {
            return result;
        }
        int data = root->val;
        if(expectNumber < data) {
            return result;
        }

        elseif(expectNumber == data) {
            vector<int> x;
            x.push_back(data);
            result.push_back(x);
        }

        else{
            expectNumber -= data;
            bool left = findPath(&result, root->left, expectNumber);
            bool right = findPath(&result, root->right, expectNumber);
            if( left || right ) {
                for(int i = 0; i < result.size(); i++) {
                    result[i].push_back(data);
                    reverse(&(result[i]));
                }
            }
        }
        return result;
    }

    bool findPath(vector<vector<int> >* result, TreeNode* root, intexpectNumber) {
        if(root == NULL && expectNumber == 0) {
            return true;
        }
        elseif(root == NULL) {
            return false;
        }

        int data = root->val;

        if(expectNumber < data) {
            return false;
        }

        elseif(expectNumber == data&& root->left == NULL && root->right == NULL) {
            vector<int> x;
            x.push_back(data);
            result->push_back(x);
        }

        else{
            expectNumber -= data;
            vector<vector<int> > left;
            bool bLeft = findPath(&left, root->left, expectNumber);
            if(bLeft) {
                for(inti = 0; i < left.size(); i++) {
                    left.at(i).push_back(data);
                    result->push_back(left[i]);
                }
            }
            vector<vector<int> > right;
            bool bRight = findPath(&right, root->right, expectNumber);
            if(bRight) {
                for(int i = 0; i < right.size(); i++) {
                    right.at(i).push_back(data);
                    result->push_back(right[i]);
                }
            }
        }

        return result;
    }

    void reverse(vector<int>* v) {
        int size = v->size();
        int half = size / 2;
        for(inti = 0; i < half; i++) {
            int tmp = v->at(i);
            v->at(i) = v->at(size - i - 1);
            v->at(size - i - 1) = tmp;
        }
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 08:00:51

【剑指Offer】二叉树中和为某一值的路径的相关文章

剑指offer-25.二叉树中和为某一值的路径

0 题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 1 分析 深度优先遍历+回溯. 出点就是,当target==0,且节点没有子树的时候. vector<vector<int>> FindPath(TreeNode *root, int target) { vector<vector<int>> ret; vector<int> tmp; aux(

剑指offer--31.二叉树中和为某一值的路径

深度优先搜索 ---------------------------------------------------------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度指数:317971 算法知识视频讲解 题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的

剑指offer 二叉树中和为某一值得路径

class Solution { public: void recur(TreeNode* root, const int expectNumber, int curr, vector<vector<int>>& res, vector<int>& path){ path.push_back(root->val); curr += root->val; bool isLeaf = (root->left == nullptr &

24、剑指offer--二叉树中和为某一值的路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 解题思路:本题采用先序遍历,遍历到叶子节点,如果和不等于其值,则返回至上一层的根结点,本题使用栈结构来存储路径,这样可以方便返回上一父结点的时候,将当前结点从路径中删除 1 /*struct TreeNode { 2 int val; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 Tre

剑指offer---二叉树中和为某一值的路径

/* 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&

LeetCode | 面试题34. 二叉树中和为某一值的路径【剑指Offer】【Python】

LeetCode 面试题34. 二叉树中和为某一值的路径[剑指Offer][Medium][Python][回溯] 问题 力扣 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 返回: [ [5,4,11,2], [5,8,4,5] ] 提示: 节点总数 <= 10000 注意:本题与主站 1

二叉树中和为某一值的路径-剑指Offer

二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 用栈来存储二叉树的路径,遍历到叶子结点就判断是否总和为target,是的话打印,若不是叶子结点,那继续遍历左右子树 注意:打印完后返回父结点时要弹出栈顶的叶子结点,并且总和减去该值 注意:打印路径时要遍历栈 代码 import java.util.ArrayList; import java.util.Stack;

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

输入一个二叉树,查找该树的所有路径(从根结点到叶结点的通路),并返回和(路径上所有结点值的和)为某一指定值的路径. 1 /////////////二叉树中和为某一值的路径///////////////////// 2 void FindPath(BinaryTreeNode* pRoot ,int expectedSum ,vector<int>& path ,int currentSum) 3 { 4 if (pRoot == NULL) 5 { 6 return; 7 } 8 cu

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

二叉树中和为某一值的路径 参与人数:2929时间限制:1秒空间限制:32768K 算法知识视频讲解 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 牛客网不给测试用例让我感到很迷惑啊..再次提醒自己,vector是否为空用vector.empty()判断! // 24.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <v

【剑指offer】十七,二叉树中和为某一值的路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 分析:队树的节点值得求和之类的操作大部分都是基于树的遍历操作的,只要对树的遍历操作稍作变形,基本都能解决问题(个人观点).我们知道只有树的先序遍历是首先访问根节点的,此题的关键在于如何把树遍历过程中的节点保存下来,把满足条件的路径加入到结果中,不满足条件的路径节点如何进行重新的搜索.当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径上,并