二叉树oj ----->二叉树的最近公共祖先
Posted ohana!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树oj ----->二叉树的最近公共祖先相关的知识,希望对你有一定的参考价值。
题目内容:
解题思路:
公共祖先的意思就是,离这两个结点最近的公共结点,有可能是他们的双亲,也有可能是他们双亲的双亲,所以,我们的解题思路也随之而来了,就是寻找在到达他们的路径上,有没有出现重合的结点,那么这就是他们的最近的公共祖先
- 给一个查找路径的方法
- 将所到的结点,按正确的存储方式放在栈当中
- 进行比较,如果有相同的,就返回他,若没有就返回null
解题代码:
class Solution {
public boolean getNode(TreeNode root,Stack<TreeNode> s,TreeNode node){
//进行检测,判断是否为空,如果有一个为空,就直接返回
if(root == null || node == null){
return false;
}
//将结点入栈
s.push(root);
//如果结点刚好和node相等就直接返回
if(root == node){
return true;
}
//开始进行递归,如果在左子树当中就返回true
if(getNode(root.left,s,node)){
return true;
}
if(getNode(root.right,s,node)){
return true;
}
//走到这里说明此时栈顶的元素不是我们要找结点所走的路径,将栈顶的元素移除掉
s.pop();
return false;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || p == null || q == null){
return null;
}
Stack<TreeNode> s1 = new Stack<>();
Stack<TreeNode> s2 = new Stack<>();
getNode(root,s1,p);
getNode(root,s2,q);
int ps = s1.size();
int qs = s2.size();
while(!s1.empty() && !s2.empty()){
if(s1.peek() == s2.peek()){
return s1.peek();
}
if(ps > qs){
s1.pop();
ps--;
}else if(qs > ps){
s2.pop();
qs--;
}else{
s1.pop();
s2.pop();
ps--;
qs--;
}
}
return null;
}
}
以上是关于二叉树oj ----->二叉树的最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章