题目来源:leetcode

题目描述:

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Given the following binary tree:  root = [3,5,1,6,2,0,8,null,null,7,4]

Example 1:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of nodes 5 and 1 is 3.

一开始就决定了要用深度优先遍历,因为这样会保存他的所有祖宗结点,企图用一个栈去判断,然后发现找俩个最前面那个的前面一个不满足条件(混乱……今天阿里面试还凉了( ╯□╰ ),所以还是两个栈各自保存,他们的祖宗结点路径,也就是先序遍历,然后比较得到最最近一个共同节点。

You are here!
Your runtime beats 100.00 % of java submissions

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
12         //bfs
13         if(p.left==q||p.right==q) return p;
14         if(q.left==p||q.right==p) return q;
15         Stack<TreeNode> s1=new Stack();
16         Stack<TreeNode> s2=new Stack();
17         TreeNode visit=root;
18         TreeNode r=root;
19         while(root!=p)
20         {
21             if(root==null){
22                 root=s1.peek();
23                 if(root.right==null||root.right==visit) {  visit=root; s1.pop(); root=null;}
24                 else{
25                     visit=root;
26                     root=root.right;
27                 }
28
29             }
30
31             else{
32                 s1.push(root);
33                 root=root.left;
34             }
35         }
36         s1.push(root);
37         root=r;
38          while(root!=q)
39         {
40             if(root==null){
41                 root=s2.peek();
42                 if(root.right==null||root.right==visit) {  visit=root; s2.pop(); root=null;}
43                 else{
44                     visit=root;
45                     root=root.right;
46                 }
47
48             }
49             else{
50
51                 s2.push(root);
52                 root=root.left;
53             }
54         }
55         s2.push(root);
56         root=s1.peek();
57         while(s2.search(root)==-1) {
58             s1.pop();
59             root=s1.peek();
60         }
61         return root;
62     }
63 }
64 // public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
65     //     TreeNode pfather=findFather(root,p);
66     //     TreeNode qfather=findFather(root,q);
67     //     if(pfather!=qfather) return lowestCommonAncestor(root,pfather,qfather);
68     //     return pfather;
69     // }
70     // public TreeNode findFather(TreeNode root, TreeNode kid)
71     // {
72     //     if(root==null) return null;
73     //     if(root.left==kid||root.right==kid) return root;
74     //     TreeNode l=findFather(root.left,kid);
75     //     TreeNode r=findFather(root.right,kid);
76     //     return l==null?r:l;
77     // }空间受限

View Code

加油啊

转载于:https://www.cnblogs.com/cuphoria/p/10609816.html

[JAVA]寻找最低公共祖宗结点相关推荐

  1. 二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】

    题目要求: 输入二叉树中的两个结点,输出这两个及诶单在数中最低的共同父结点. 题目分析: 还有一种情况:如果输入的两个结点中有一个或两个结点不在二叉树中,则输出没有共同父结点: 因此,可以在程序中定义 ...

  2. 寻找树中两个结点的最低公共祖先

    寻找树中两个结点的最低公共祖先 Q:在树中寻找两个结点的最低公共祖先,是什么意思呢? A:树是由根节点衍生左右孩子继续衍生左右孩子的左右孩子.所以呢树中的两个结点是一定拥有最低公共祖先(这两个结点Q: ...

  3. 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现

    最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...

  4. 树中两个结点的最低公共祖先

    题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...

  5. 50:树中两个结点的最低公共祖先

    题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针. 树的结点定义 private static class TreeNode {int val;List<TreeNo ...

  6. 寻找二叉树两个结点的最低共同父节点

    寻找二叉树两个结点的最低共同父节点 题目:二叉树的结点的定义如下: struct TreeNode {int m_nValue;TreeNode *m_pLeft;TreeNode *m_pRight ...

  7. 有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!

    对该问题,分为如下几种情形讨论: 情形一: 假如该树为二叉树,并且是二叉搜索树, 依据二叉搜索树是排过序的, 我们只需要从树的根结点开始,逐级往下,和两个输入的结点进行比较. 如果当前结点的值比两个结 ...

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

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

  9. 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点[数据结构]

    题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...

  10. 程序员面试100题之五:二叉树两个结点的最低共同父结点

    题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...

最新文章

  1. python django windows_Python+Django在windows下的开发环境配置图解
  2. 我的理解:什么是WCF
  3. Python:SQLMap源码精读—基于错误的盲注(error-based blind)
  4. [线程池] ------ 形象的描述线程池,用一个特好记的例子来记忆
  5. L2-007. 家庭房产
  6. html定义不同的类,定义不同的节点类型.html
  7. java并行调度_java并行调度框架封装及示例
  8. 【转载】启发式搜索技术A*【译】
  9. (原创)c++11改进我们的模式之改进单例模式
  10. Google Cloud Fundamentals简介
  11. Android下载网络图片并缓存
  12. 根据二次曲面模型法建立区域高程异常拟合模型
  13. 亚信科技外包_外包到亚信---转正疑问 - 菜鸟@大虾的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  14. ubuntu20.05安装vmware workstation 16,踩坑:GLib does not have GSettings support.
  15. 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
  16. 机器学习 简答题 速记
  17. 搜索引擎优化方式及优化策略
  18. cookiecutter笔记
  19. 【ODX介绍】-4.3-UDS诊断$3E服务在ODX-D诊断描述文件中如何描述
  20. VMWare虚拟机 网络连接模式介绍

热门文章

  1. 计算机网络技术评价,计算机网络专业自我评价范文
  2. Mysql的使用记录
  3. 电子病历命名实体识别NER
  4. 渣硕试水字节跳动,本以为简历都过不了,123+HR面直接拿到意向书
  5. Mac illustrator 输入特殊字符(如希腊字符)
  6. Java抖音核销代码,java抖音团购券码核销(有代码案例)
  7. 再也不怕没有简历模板啦
  8. solr学习(一)入门
  9. 记录国内Windows环境下搭建 Battery Historian遇到的问题
  10. 跟波哥学习php之会话管理图片上传验证码(第五季)-lampol-专题视频课程