链表结构,寻找p、q最近的公共祖先

数据结构与算法之链表结构寻找p、q最近的公共祖先

  • 链表结构,寻找p、q最近的公共祖先
  • 问题
  • 想法
  • 代码

问题

设一棵二叉树的结点结构为(LLINK, INFO, RLINK), ROOT为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,试编写算法ANCESTOR (ROOT, p, q, r),该算法找到p和q的最近公共祖先结点r。

想法

这道题就是考察的非递归后序遍历算法中对于辅助栈的理解

  • 这道题的目的:**了解后序遍历的特性(在遍历中,栈内元素都是当前元素的直系祖先)**学明白了这一点,就是你做这道题最大的收获。

  • 在遍历中,栈内元素都是当前元素的直系祖先!为什么?

    • 栈的存在的意义:访问到了,但是还没有轮到它输出。
    • 为什么没有轮到他输出?因为顺序是左右根,它是根,所以现在还不能输出,所以入栈了。那么!接下来怎么办!访问它的左和右(孩子)。也就是说,当你访问一个结点时,对于栈内的每一个元素而言,它为什么会在栈内?因为现在在访问它的孩子或者是孩子的孩子等等等等,也就是对于当前结点而言,栈内的每一个元素都是它的祖先

观看视频增加理解:后序遍历

代码

/*** 寻找p、q最近的公共祖先** @param root 根节点* @param root 要搜索节点,p节点出现的速度要把q快* @param q    要搜索节点* @return p、q最近的公共祖先*/
public TreeNode findNearestAncestor(TreeNode root, TreeNode p, TreeNode q) {Stack<TreeNode> pSuperStack = getSuperTreeNodeStack(root, p);Stack<TreeNode> qSuperStack = getSuperTreeNodeStack(root, q);while (!pSuperStack.empty() && !qSuperStack.empty()) {//todo:栈内元素比较,找出最接近的哪一个元素Stack<TreeNode> stack = new Stack<>();Collections.copy(stack, qSuperStack);TreeNode pPop = pSuperStack.pop();while (!stack.empty()) {if (stack.pop() == pPop) {return pPop;}}}return null;
}/*** 找出p节点所有祖先,并且用栈返回,栈内结点也是父->子关系** @param root 根节点* @param p    要查找节点* @return 包含p点所有祖先的栈*/
private Stack<TreeNode> getSuperTreeNodeStack(TreeNode root, TreeNode p) {Stack<TreeNode> stack = new Stack<>();stack.push(root);TreeNode pre = null;while (root != null || !stack.empty()) {while (root != null) {stack.push(root);root = root.left;}if (!stack.empty()) {root = stack.peek();}assert root != null;//栈顶有右子树且未被访问过if (root.right != null && root.right != pre) {root = root.right;} else {//访问当前结点if (root == p) {return stack;}pre = root;//此时p是栈顶元素,直接将p置空,下次循环直接就是获取栈顶元素,避免重复访问左子树root = null;stack.pop();}}return stack;
}

数据结构与算法之链表结构寻找p、q最近的公共祖先相关推荐

  1. 二叉链表之寻找两节点的最近公共祖先☆

    题目:p.q分别为指向该二叉树中任意两个节点的指针,试编写算法ancestor(root,p,q,r),找到p.q的最近公共祖先节点r 分析:         上一道题其实可以给我们一些启示,就是我们 ...

  2. 数据结构与算法:1.链表结构

    1 Python链表 1.1基本概念 概念:链表是通过一个个节点组成的,每个节点都包含了称为cargo的基本单元,它也是一种**递归**的数据结构. 图示:能保持数据之间的逻辑顺序,但不必按照顺序存储 ...

  3. 数据结构与算法之线性结构链表

    数据结构与算法之线性结构链表 这一篇文章主要介绍的是通过java实现单链表.循环链表和双向循环链表,仅供自己复习使用,如有什么不足之处,欢迎指出. 单链表: package xianxingjiego ...

  4. 数据结构与算法 内核链表实现商品购物系统项目+Makefile

    数据结构与算法 内核链表实现商品购物系统项目 第一章 项目实现思维 [1]编译介绍 [2]框架思维 第二章 Makefile编写 第三章 代码编写实现 [1]favorite.txt文件 [2]his ...

  5. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  6. 一文通数据结构与算法之——链表+常见题型与解题策略+Leetcode经典题

    文章目录 1 链表 1.1 常见题型及解题策略 1.1.1 LeetCode中关于链表的题目有以下五种类型题: 1.1.2 解题策略 1.2 链表的基本内容 1.2.1 链表的基本结构: 1.2.2 ...

  7. python函数结构图_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  8. python define graph_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  9. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

最新文章

  1. C语言编写的PHP框架--yaf入门编程
  2. linux变量inode,linux字符cdev和Inode的关系
  3. 【Network Security!】搭建文件分享服务器,其实也可以很简单-HFS
  4. Java_Web使用简单的批处理操作
  5. Ubuntu 安装JDK8
  6. SAP Smartforms 条码打印
  7. 怎样推断两个日期在一周内
  8. 华为P30Pro开箱照曝光 四摄模组+徕卡镜头确认
  9. 安装配置mac版_全面战争三国 Mac版Mod安装指南
  10. 问题解决-Visio2016和Office不能并行
  11. 【树莓派】设置树莓派开机自动运行python脚本
  12. 案例|工业物联网解决方案•工业互联网云平台
  13. 鸿蒙开发实例|构建轻量级智能穿戴设备用户界面
  14. 如何防止CSRF攻击
  15. 农业银行代销基金一览表
  16. win10键锁定计算机,Win10中最强大的键!你所不知道的Win键
  17. ThingsBoard教程(十九):规则节点概览介绍
  18. 用心整理10个宝藏APP,涨薪刚需,入股不亏
  19. 教务系统—课程表接口信息
  20. 软件架构设计系列总结

热门文章

  1. 2022年linux面经必备(持续更新中)
  2. WIN7下VirtualBox “指令引用的0x0000000内存”报错问题
  3. PMBOK6 核对单和核查表的区别
  4. 红米k30至尊纪念版和华为mate30pro哪个值得买
  5. JVM内存模型(一篇足以)
  6. 微博蓝V认证怎么做?(微博企业认证)
  7. 4.3_deferred-init
  8. 如何在 LaTeX 中画一个树状图(使用tikz和tikz-qtree包中的宏绘制树、森林、二叉树)
  9. latex语法_【研创基地科研实训】关于举办第27期“LaTeX使用技巧交流分享会” 线上科研实训交流活动的通知...
  10. 哈佛图书馆自习室墙上的20条训言(中英文)