问题:

找到两个节点的二叉树的最近的共同祖先。

首先可以参考这个博客http://blog.csdn.net/cxllyg/article/details/7635992 ,写的比較具体,包含了节点包含父指针和不包含父指针的情况,还介绍了经典的Tarjan算法。

Tarjan算法非常精妙,可是使用了并查集,须要额外O(n)的存储空间。

上面博客中给的第三个方法也是须要记录根到节点的路径,须要O(log n)空间,当然考虑到普通情况下我们遍历树都是递归的方式。所以本身方法调用栈就是O(log n)空间占用率。 可是这是对于平衡的二叉树而言的。在最差情况下空间占用率还是O(n)。

所以。这里我给的算法不须要记录根到节点的路径。并且只遍历树一遍就能够完毕。

1. 首先深度遍历树,找到第一个节点,如果为p。这时设置两个节点的近期公共祖先为p

2. 继续深度遍历,找另外一个节点q, 如果这时找到q, 那么二者近期祖先就是p.

3. 否则,回退到上一层,这时二者的近期公共祖先也对应改成了p的父节点。由于以p为根的子树中没有发现另外一个节点q

4. 依此类推。找不到则继续回退到上一层,当找到q时,相应的二者近期公共祖先也就找到了。

5. 若是p==q,直接返回p作为近期公共祖先

6. 若二者不都存在于树中,则返回空。


public class CommonAncestor {public static void main(String[] args) {CommonAncestor ca=new CommonAncestor();TreeNode root=new TreeNode(0);TreeNode l1=new TreeNode(-1);TreeNode r1=new TreeNode(1);root.left=l1;root.right=r1;TreeNode l1l1=new TreeNode(-2);TreeNode l1r1=new TreeNode(-3);l1.left=l1l1;l1.right=l1r1;TreeNode r=ca.commonAncestor(root, l1, r1);System.out.println(r.val);}private TreeNode ancestor=null;private TreeNode firstFound=null;private boolean found=false;public CommonAncestor(){}public TreeNode commonAncestor(TreeNode root,TreeNode p,TreeNode q){this.ancestor=null;this.found=false;findCommonAncestor(root,p,q);if(found)return ancestor;elsereturn null;}private void findCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null)return ;if(found)return;this.findCommonAncestor(root.left, p, q);test(root,p,q);this.findCommonAncestor(root.right, p, q);test(root,p,q);}private void test(TreeNode root, TreeNode p, TreeNode q) {if(found)return;if(this.ancestor==null){if(root==p){this.ancestor=p;firstFound=p;if(p==q)found=true;}else if(root==q){this.ancestor=q;firstFound=q;if(p==q)found=true;}}else{if(root.left==this.ancestor||root.right==this.ancestor){this.ancestor=root;}if((root==p||root==q)&&root!=firstFound){found=true;}}}}

版权声明:本文博主原创文章。博客,未经同意不得转载。

二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))...相关推荐

  1. LeetCode 236. 二叉树的最近公共祖先

    文章目录 解法1:保存祖先节点+逐个判断 解法2:深度优先遍历 解法3:记录祖先节点 https://leetcode-cn.com/problems/lowest-common-ancestor-o ...

  2. 最近公共祖先 LCA Tarjan算法

    来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...

  3. 常考数据结构与算法:在二叉树中找到两个节点的最近公共祖先

    题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点.   假设节点的值都大于0. 比如9,10的最近公共祖先节点是2. 思路: 从根节点开始遍历 ...

  4. PAT甲级1151 LCA in a Binary Tree (30 分):[C++题解]LCA、最低公共祖先、哈希表映射

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 和下面这道题几乎是同一题:PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA.最低 ...

  5. 程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]

    题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点.用递归和循环两种方法完成树的镜像转换. 例如输入: 8     /  \   6      1 ...

  6. 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)

    236. 二叉树的最近公共祖先 class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'T ...

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

    链表结构,寻找p.q最近的公共祖先 数据结构与算法之链表结构寻找p.q最近的公共祖先 链表结构,寻找p.q最近的公共祖先 问题 想法 代码 问题 设一棵二叉树的结点结构为(LLINK, INFO, R ...

  8. LeetCode二叉树系列——236.二叉树的最近公共祖先

    一.题目描述: 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表 ...

  9. 求节点p和q的最近公共祖先节点

    //求节点p和q的最近公共祖先节点,假设用后序遍历先遇到p节点 typedef struct{BiTree t;int tag; //tag=0表示左子女已被访问,tag=1表示右子女已被访问. }s ...

  10. 《数据结构与算法 Python语言描述》 读书笔记

    已经发布博客 <数据结构与算法 Python语言描述> 读书笔记 第二章 抽象数据类型和Python类 2.1 抽象数据类型abstract data type:ADT 2.1.1 使用编 ...

最新文章

  1. C++中的位运算和|
  2. 小猿圈python学习-函数的递归
  3. 要养成良好的书写SQL的习惯
  4. drupal 字符串替换符号 @ % !
  5. Docker应用基础
  6. 搭建高可用的分布式hadoop2.5.2集群  HDFS HA
  7. oracle-不完全数据库恢复-被动恢复-RMAN-06025/ORA-01190
  8. 安装apache重启的时候,报错端口被占用,错误1
  9. npy文件的保存与读取
  10. 选择SOA平台的标准是什么?
  11. lopa分析_保护层分析(LOPA)方法简介1.ppt
  12. 华为员工去面试被淘汰后怒怼HR:华为出来的也能被拒,很无语
  13. SQL 语句单引号、双引号的用法
  14. 电脑重装系统引导方式不是BIOS 不能引导MBR磁盘怎么办
  15. android第三方上传文件,安卓和苹果终于打通!互传文件无需借助第三方,一碰就能传...
  16. 12、【李宏毅机器学习(2017)】Semi-supervised Learning(半监督学习)
  17. Portal服务器开源无线,OpenPortalServer开源Portal服务 Web认证服务器 支持华为 H3C 锐捷设备...
  18. pl/sql编程----触发器
  19. Element UI表格行拖拽功能
  20. USB转232串口驱动程序

热门文章

  1. Atitit.异步编程 java .net php python js 的比较
  2. paip.输入法编程---输入法ATIaN历史记录 v8b
  3. paip.提升安全性----软键盘的弱点
  4. paip.ASP加密新总结
  5. 郑志勇:谁是中国最牛指数基金供应商(规模统计与产品点评)
  6. (转)孙正义:数字资产会成为人类最大的资产
  7. CTP: 接收心跳超时Bug
  8. 凌云一周看点 | 混合云多Region架构;云上用户定制化网络;边缘云全站加速;什么是操作系统的云原生...
  9. PolarDB-X 一致性共识协议 (X-Paxos)
  10. 当我讲容灾交付前,我先说点啥?