今天在做leetcode236时受到启发,怎么求二叉树根节点到二叉树任意结点(该节点在二叉树中存在)的路径?当然,前提是二叉树各节点的值不相等。

示例

输入:root = [3,5,1,6,2,0,8,null,null,7,4] ,target=4

输出:{3,5,2,4}

思路一:我们可以用哈希表存储所有节点的父节点,根节点的父节点设为nullptr;然后我们就利用节点的父节点信息从target节点开始不断往查找,并将当前结点的值存储到ans中,直到查找到nullptr。ans最终存储的是target结点到根节点的路径,为了得到根节点到目标结点的路径,还需要翻转ans中的元素。

实现

unordered_map<int, TreeNode*> fa;                      //存储所有结点的父节点
//存储所有节点的父节点
void dfs(TreeNode* root){if (root->left != nullptr) {fa[root->left->val] = root;dfs(root->left);}if (root->right != nullptr) {fa[root->right->val] = root;dfs(root->right);}
}
vector<int> findPath(TreeNode* root,TreeNode* target) {fa[root->val]==nullptr;               //根节点的父节点为nullptrdfs(root);vector<int>ans;while(target!= nullptr){ans.emplace_back(target->val);target=fa[target->val];}//ans存储的路径是反着的,需要翻转一下容器元素reverse(ans.begin(),ans.end());return ans;
}

思路二:从根节点向target节点递归的查找,首先查找左子树,当左子树没有查找到时,再去查找右子树。

实现

//递归查找根节点,返回true代表当前子树查找到;返回false代表当前子树没有查找到。s为传入参数,当该函数调用结束时,s中存储的是target节点到根节点的路径,所以如果要得到根节点到target的路径,还需要对s中的元素进行翻转处理。
bool findPathDiGui(TreeNode *root, stack<TreeNode *> &s, TreeNode *node) {if (root == nullptr)return false;s.push(root);//查找到target节点if (root->val == node->val)return true;bool b = false;//先去查找左子树if (root->left != nullptr)b = findPathDiGui(root->left, s, node);//当左子树没有查到时,去查找右子树if (!b && root->right != nullptr)b = findPathDiGui(root->right, s, node);//当没有找到,就弹出当前结点if (!b)s.pop();return b;
}//查找根节点到tartget节点的路径
vector<int> findPath(TreeNode* root,TreeNode* target){stack<TreeNode *> s;findPathDiGui(root, s, target);vector<int> ans;while (!s.empty()) {auto cur = s.top();s.pop();//由于s中存储的是target节点到父节点的路径,所以每次在ans的开始的位置插入路径值ans.insert(ans.begin(), cur->val);    }return ans;
}

相关阅读
[C++]leetcode题解之二叉搜索树的最近公共祖先

[c++]查找二叉树根节点到任意结点的路径相关推荐

  1. 二叉树(根节点到任意结点的路径)

    假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点,编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点).path ...

  2. 输出二叉树根节点到叶子结点所有路径

    方法一:递归.每次把左节点加入到列表中,知道遇到叶节点结束,返回至上一层节点,并查其右节点,以此类推. private static List<String> binTreePath1(T ...

  3. 求二叉树指定结点到根的路径c语言,二叉树根节点到叶子结点和为指定值的路径...

    题目描述 image.png 题解 解题思路与二叉树根节点到叶节点的所有路径和一题相似,都是采用递归算法.但这个题加了一点,要求保存路径到vector中. 为了保存路径,这里给递归函数传递一个vect ...

  4. 找二叉树根节点到叶子结点最长路径

    void Findpath(BiTree T){//后序遍历法寻找从根节点到叶子结点最长路径BiTree stack[MaxSize],path[MaxSize],p=T,r;int top=-1,m ...

  5. 求二叉树根节点到指定节点的路径

    算法 求二叉树根节点到指定节点的路径 @author:Jingdai @date:2020.11.05 题目描述 给你一个棵二叉树,再给你一个指定的节点,求根节点到指定节点的路径. 如图,比如让你求到 ...

  6. java计算二叉树的节点最小值_求二叉树根节点到叶子节点路径和的最小值:遍历(递归+非递归)...

    昨晚中兴笔试题,第一题是给定二叉树,每个节点的数据结构是 value,left,right,比较根节点到各个叶子节点路径和的大小,输出路径和的最小值.(补充:用ArrayList可以存储) 以前没做过 ...

  7. 求二叉树根节点到叶节点的所有路径

    257. 二叉树的所有路径 难度:简单 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径. 叶子节点 是指没有子节点的节点. 思路 使用迭代法,从根节点开始到叶节点 ...

  8. java根节点到叶子节点_二叉树根节点到叶子节点的所有路径和

    我觉得这个题目和剑指offer中的一道题目非常相似.先说这个题: 解题思路:从根结点开始,当每访问到一个结点,我们把该结点添加到路径上,并"累加" 该结点的值,这里"累加 ...

  9. 二叉树删除节点,(查找二叉树最大值节点)

    从根节点往下分别查找左子树和右子树的最大节点,再比较左子树,右子树,根节点的大小得到结果,在得到左子树和右子树最大节点的过程相似,因此可以采用递归的 //树节点结构 public class Tree ...

最新文章

  1. oracle中spool卸数,Oracle中如何快速的卸载和加载数据?
  2. 数据库复习1——数据库体系结构和关系系统
  3. android网络请求回调管理,Android HTTP网络请求的异步实现
  4. Storing XML in Relational Databases(2)
  5. sql server 快照_SQL Server复制:配置快照和事务复制
  6. android 5.1禁止休眠
  7. oracle存储空间修改,Oracle修改内存大小
  8. android如何设置透明字体颜色,Android设置字体透明度
  9. Java桶排序LSD
  10. kmeans-用户分层
  11. Elasticsearch 集群报错 master not discovered yet
  12. 你不会因为实施了Scrum而变敏捷
  13. 七自由度冗余机械臂运动学逆解与工作空间分析MATLAB实现
  14. hdu 1880 魔咒词典 (字符串哈希)
  15. Timer和counter
  16. Longhorn,企业级云原生容器分布式存储 - 高可用
  17. 《关键对话——如何高效能沟通》读书笔记
  18. Http头:only-if-cached
  19. 采购工作的基本内容和注意事项
  20. oracle 数据库如何获取一条sql语句执行所消耗耗费的时间?

热门文章

  1. 酒店直播服务器系统,用ffmpeg+nginx服务器实现类似酒店视频直播系统
  2. 分析一下,直播类app开发需要哪些技术
  3. html的底层代码是哪种语言,HTML是什么
  4. Mysql数据库结构同步时报错:Result: 1118 - Row size too large.
  5. 企业网络-小型企业网络搭建
  6. YAMAHA机器人(EtherNet/IP)与西门子S71500系列PLC(PROFINET)通讯
  7. C语言及程序设计 实践参考——个人所得税计算器if语句版
  8. (附源码)计算机毕业设计SSM电影网站系统
  9. 你们还不知道这几个批量处理图片大小的方法吗?
  10. 实战项目(一)嵌入式基础学习与上位机入门设计