剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)

简介: 剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)

题目描述:

输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。


1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点


2.叶子节点是指没有子节点的节点


3.路径只能从父节点到子节点,不能从子节点到父节点


4.总节点数目为n


如二叉树root为{10,5,12,4,7},expectNumber为22

则合法路径有[[10,5,7],[10,12]]

数据范围:

树中节点总数在范围 [0, 5000] 内

-1000 <= 节点值 <= 1000

-1000 <= expectNumber <= 1000

 

示例1:

输入:

{10,5,12,4,7},22


返回值:

[[10,5,7],[10,12]]


说明:

返回[[10,12],[10,5,7]]也是对的

示例2:

输入:

{10,5,12,4,7},15


返回值:

[]

解题思路:

本题考察数据结构树的使用,运用深度优先遍历dfs解题。


1)定义result存储结果,定义path获取路径信息。


2)dfs函数中,path存储当前结点的值,若当前结点符合目标值且无左右子树,则说明该path是我们要的,存储到result中。


3)第二步如果没得到目标path,则继续对结点的左子树进行dfs,再对右子树进行dfs,注意此时输入给dfs的expectNumber是减去了当前结点数值的。


4)dfs执行完左右子树的判断后,务必进行pop_back处理,将最后一个结点弹出,因为该路径失败了,溯回找上一个分叉路口,走另一条分支,以此类推。

测试代码:

/*
struct TreeNode {
  int val;
  struct TreeNode *left;
  struct TreeNode *right;
  TreeNode(int x) :
      val(x), left(NULL), right(NULL) {
  }
};*/
class Solution {
public:
    // 深度遍历
    void dfs(TreeNode* root,int expectNumber,vector<int> &path,vector<vector<int>> &result)
    {
        path.push_back(root->val);
        if(root->val==expectNumber&&!root->left&&!root->right)
            result.push_back(path);
        if(root->left)
            dfs(root->left,expectNumber-root->val,path,result);
        if(root->right)
            dfs(root->right,expectNumber-root->val,path,result);
        path.pop_back();
    }
    vector<vector<int>> FindPath(TreeNode* root,int expectNumber) {
        vector<vector<int>> result;
        vector<int> path;
        if(!root)
            return result;
        dfs(root,expectNumber,path,result);
        return result;
    }
};


相关文章
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
102 64
|
17天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
59 16
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
20 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
29 0
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
25 0
|
1月前
05(数据结构考研)树相关操作代码
05(数据结构考研)树相关操作代码
28 0
|
1月前
|
存储 算法 Java
数据结构和算法--分段树
数据结构和算法--分段树
16 0
|
1月前
【数据结构】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树
【数据结构】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树
42 0