寻找二叉树上从根结点到给定结点的路径

一、递归实现

思想:借助栈结构来保存路径上的结点,首先从根结点开始,一直往左找,如果左边找到就返回true;否则,如果左边找不到并且右子树不为空的情况下再继续往右子树找。如果左右子树都找不到,就弹出栈顶结点并返回false。方法运行完毕后,栈中保存的元素就是一条从根到给定结点的路径。

public static boolean searchNode(TreeNode root,Stack<TreeNode> s,TreeNode node) {if(root == null) return false;s.push(root);if(root.val == node.val) return true;boolean b = false;//先去左子树找if(root.left != null) b = searchNode(root.left,s,node);//左子树找不到并且右子树不为空的情况下才去找if(!b && root.right != null) b = searchNode(root.right,s,node);//左右都找不到,弹出栈顶元素if(!b) s.pop();return b;}

程序运行结束后,栈中保存的就是要求的路径,参数root代表根节点,s代表栈,node代表给定的节点。如果不想用值来比较,就直接把if(root.val == node.val)换成if(root == node),道理都是一样的。

二、非递归实现

思想:这个稍微有些复杂,当然也是要借助栈来完成。其实这里和二叉树的非递归先序遍历的思想差不多,只是在这个基础上进行一些改造。首先,新建一个栈,保存根节点。然后开始一直向左查找,查找的过程中把结点入栈。如果在向左找的过程中遇到了给定的结点,那么就输出并返回,这个过程比较好理解。关键是下面的弹栈的过程,如果在向左找的过程中遇到了null,说明当前栈顶元素的左子树为null。那么我们向栈顶元素的右子树开始查找。令p为栈顶元素,如果栈顶元素的右子树为null,那么弹出栈顶元素,并用pre来保存刚弹出的元素,之所以设置pre,是因为如果当前栈顶元素的右子树不为null的时候,不能轻易弹出,首先得去右子树上去查找,如果右孩子被弹出了,说明右子树上肯定没有,那么当前结点才可以弹出。

public static void searchNode(TreeNode root,TreeNode node) {if(root == null || node == null) return;Stack<TreeNode> s = new Stack<>();TreeNode p = root;TreeNode pre = null; //上一次出栈的结点while(p != null || !s.isEmpty()) {while(p != null) {//这个while循环的思想还是一直往左找,找的过程结点入栈,如果找到了就打印输出并返回。
                s.push(p);if(p.val == node.val) {for (TreeNode treeNode : s) {System.out.print(treeNode.val + " ");}return;}p = p.left;}//走到这一步说明栈顶元素的左子树为null,那么就开始往栈顶元素的右子树上去找。if(!s.isEmpty()) {p = s.peek();//如果栈顶元素的右子树为null,或者右子树被遍历过,则弹栈。while(p.right == null || pre != null && p.right == pre) {pre = s.pop();p = s.peek();}//继续遍历p的右子树p = p.right;}}}

posted @ 2018-08-16 13:23 neu_张康 阅读( ...) 评论( ...) 编辑 收藏

寻找二叉树上从根结点到给定结点的路径相关推荐

  1. 每天一道LeetCode-----以字符串的形式输出二叉树所有从根节点到叶子节点的路径

    Binary Tree Paths 原题链接Binary Tree Paths 将二叉树中所有从根节点到叶子节点的路径以字符串的形式输出出来 直接遍历即可,注意只有左右子节点都是空节点时才叫叶子节点 ...

  2. 求二叉树上结点的路径c语言版,求二叉树根到给定节点的路径设计报告.doc

    求二叉树根到给定节点的路径设计报告 题目: 求二叉树根到给定节点的路径 摘要:本程序设计题要求出二叉树的根节点到给定节点的路径,我们利用二叉树的双亲存储表示法建立二叉树,然后在树的叶子节点中找到给定的 ...

  3. 求二叉树上结点的路径_剑指offer 二叉树

    二叉树的镜像(简单) 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 根节点左右节点调换位置 递归 注意判断空子树情况 二叉树的深度(简单) 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经 ...

  4. 求二叉树上结点的路径

    南昌航空大学实验报告 课程名称:   数据结构A   实验名称:  实验六   二叉树及其应用 (一)        班   级:     XXX           学生姓名:      XXX   ...

  5. java 树最大距离_寻找二叉树最远的叶子结点(实例讲解)

    面试的时候碰到一个题:如何找到一个二叉树最远的叶子结点,以及这个叶子结点到根节点的距离? 第一反应肯定是递归 如何能找到最远的叶子结点,同时也能记下这个叶子节点到根节点的距离呢?采用一个List保持从 ...

  6. Java实现判断叶子节点_寻找二叉树最远的叶子结点(实例讲解)

    二叉树最远的叶子实例分享 面试的时候碰到一个题:如何找到一个二叉树最远的叶子结点,以及这个叶子结点到根节点的距离? 第一反应肯定是递归 如何能找到最远的叶子结点,同时也能记下这个叶子节点到根节点的距离 ...

  7. 寻找二叉树中两个结点的最近公共祖先

    寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...

  8. 算法----- 给定一颗二叉树,找到二叉树上任意两个节点之间的距离(Java版本)

    题目: 给定一颗二叉树,找到二叉树上任意两个节点之间的距离 class TreeNode {TreeNode left;TreeNode right;} 思路: 首先找到一个节点的路径,然后找到另一个 ...

  9. 2021-10-11 寻找二叉树结点的前驱或后继结点(用到parent指针)

    关键是找前驱后继的思想理解了就好 //! 查找某个结点的前驱或后继结点(要求结点要有parent指针) //! 前驱结点定义:中序遍历中的前一个结点,而不是二叉树结构中的上一个母结点 Node *Bi ...

最新文章

  1. 机器学习入门(17)— 输入 4 维数据、基于 im2col 展开来实现卷积层
  2. 计算机论文工作进程记录,毕业设计进程记录
  3. hdu 4289 Control
  4. 两路语音 两路计算机数据综合,脉冲编码调制解调实验摘要.doc
  5. localhost与127.0.0.1之间的关系更改
  6. ajax 与route的区别,如何在Ajax.RouteLink中使用片段?
  7. atexit()函数(进程退出函数,类似析构)
  8. 悲哀!面试现场,简单几道java算法题,90%程序员没写出来
  9. 在Ubuntu 16.04 使用命令行安装Nvidia CUDA-9.0以及cudnn7
  10. Linux下conda 安装以后 activate无法使用
  11. hisi mmz模块驱动讲解
  12. 高精度轻量级实时语义分割网络:2K视频分割可达24.3GFLOPS和36.5FPS
  13. firefox插件下载失败
  14. peta linux对电脑配置要求,使用petalinux遇到的一些问题汇总
  15. 大规模异构图召回在美团到店推荐广告的应用
  16. 轻松摆好人像摄影姿势
  17. 网红“骗粉”新套路:假装在底层
  18. b站up主是怎么赚钱,b站UP主有哪些赚钱方式,通过什么赚钱?
  19. mac系统python配置
  20. 高光谱遥感数值建模技术及在植被、水体、土壤信息提取领域应用技术

热门文章

  1. PCL入门(二)——PCD
  2. IT工作者如何避免工作中的焦虑
  3. 2023中职网络安全技能竞赛新题
  4. 2008 云南大学软件学院创新软件大赛
  5. SmartAuth: User-Centered Authorization for the Internet of Things
  6. 使用JGit进行身份验证
  7. Android Studio Gradle编译异常
  8. 2020年的智能农业:物联网传感器如何创造更高效的精准农业产业
  9. 使用websocket做视频直播
  10. 所有工程师在FEA之前应了解的6件事