[JAVA]寻找最低公共祖宗结点
题目来源: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 nodes5
and1
is3.
一开始就决定了要用深度优先遍历,因为这样会保存他的所有祖宗结点,企图用一个栈去判断,然后发现找俩个最前面那个的前面一个不满足条件(混乱……今天阿里面试还凉了( ╯□╰ ),所以还是两个栈各自保存,他们的祖宗结点路径,也就是先序遍历,然后比较得到最最近一个共同节点。
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]寻找最低公共祖宗结点相关推荐
- 二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】
题目要求: 输入二叉树中的两个结点,输出这两个及诶单在数中最低的共同父结点. 题目分析: 还有一种情况:如果输入的两个结点中有一个或两个结点不在二叉树中,则输出没有共同父结点: 因此,可以在程序中定义 ...
- 寻找树中两个结点的最低公共祖先
寻找树中两个结点的最低公共祖先 Q:在树中寻找两个结点的最低公共祖先,是什么意思呢? A:树是由根节点衍生左右孩子继续衍生左右孩子的左右孩子.所以呢树中的两个结点是一定拥有最低公共祖先(这两个结点Q: ...
- 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现
最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...
- 树中两个结点的最低公共祖先
题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...
- 50:树中两个结点的最低公共祖先
题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针. 树的结点定义 private static class TreeNode {int val;List<TreeNo ...
- 寻找二叉树两个结点的最低共同父节点
寻找二叉树两个结点的最低共同父节点 题目:二叉树的结点的定义如下: struct TreeNode {int m_nValue;TreeNode *m_pLeft;TreeNode *m_pRight ...
- 有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!
对该问题,分为如下几种情形讨论: 情形一: 假如该树为二叉树,并且是二叉搜索树, 依据二叉搜索树是排过序的, 我们只需要从树的根结点开始,逐级往下,和两个输入的结点进行比较. 如果当前结点的值比两个结 ...
- PAT甲级1151 LCA in a Binary Tree (30 分):[C++题解]LCA、最低公共祖先、哈希表映射
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 和下面这道题几乎是同一题:PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA.最低 ...
- 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点[数据结构]
题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...
- 程序员面试100题之五:二叉树两个结点的最低共同父结点
题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...
最新文章
- python django windows_Python+Django在windows下的开发环境配置图解
- 我的理解:什么是WCF
- Python:SQLMap源码精读—基于错误的盲注(error-based blind)
- [线程池] ------ 形象的描述线程池,用一个特好记的例子来记忆
- L2-007. 家庭房产
- html定义不同的类,定义不同的节点类型.html
- java并行调度_java并行调度框架封装及示例
- 【转载】启发式搜索技术A*【译】
- (原创)c++11改进我们的模式之改进单例模式
- Google Cloud Fundamentals简介
- Android下载网络图片并缓存
- 根据二次曲面模型法建立区域高程异常拟合模型
- 亚信科技外包_外包到亚信---转正疑问 - 菜鸟@大虾的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- ubuntu20.05安装vmware workstation 16,踩坑:GLib does not have GSettings support.
- 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
- 机器学习 简答题 速记
- 搜索引擎优化方式及优化策略
- cookiecutter笔记
- 【ODX介绍】-4.3-UDS诊断$3E服务在ODX-D诊断描述文件中如何描述
- VMWare虚拟机 网络连接模式介绍