这道题,先序遍历,这个想到了,但是自己还是想麻烦了,还有一点bu'm不明白,我操作的不是地址吗,为什么还需要得到value值呢。这一点就是不明白。
题目如下:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
_______3______
/ \
___5__ ___1__
/ \ / \
6 _2 0 8
/ \
7 4
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点5
和节点1
的最近公共祖先是节点3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点5
和节点4
的最近公共祖先是节点5。
因为根据定义最近公共祖先节点可以为节点本身。
我的解决办法如下:
package test;
public class LC236Try1
{
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode ret=new TreeNode(-1);
getPass(root,p,q,ret);
return ret;
}
public int getPass(TreeNode root, TreeNode p, TreeNode q,TreeNode ret){
int tag=0;
if(root==null){
return 0;
}
if(root.val==p.val||root.val==q.val){
tag++;
}
int rl=getPass(root.left,p,q,ret);
if(tag+rl==2){
ret.val=root.val;
return -1;
}
if(rl==-1){
return -1;
}
int rr=getPass(root.right,p,q,ret);
if(tag+rl+rr==2){
ret.val=root.val;
return -1;
}
if(rr==-1){
return -1;
}
return tag+rl+rr;
}
}
人家的解决办法如下:
package test;
public class LC236Try2
{
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
{
if (root == null || root == p || root == q)
{
return root;
}
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left != null && right != null)
{
return root;
}
if (left != null)
{
return left;
}
else
{
return right;
}
}
}
class Solution {
TreeNode retNode=null;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
getPass(root,p,q);
return retNode;
}
public int getPass(TreeNode k, TreeNode p, TreeNode q){
if(k==null || retNode!=null){
return 0;
}
if(k.val==p.val ){
int klret=getPass(k.left,p,q);
if(klret==2){
retNode=k;
return 3;
}
int krret=getPass(k.right,p,q);
if(krret==2){
retNode=k;
return 3;
}
return 1;
}
if(k.val==q.val){
int klret=getPass(k.left,p,q);
if(klret==1){
retNode=k;
return 3;
}
int krret=getPass(k.right,p,q);
if(krret==1){
retNode=k;
return 3;
}
return 2;
}
int klret=getPass(k.left,p,q);
if(klret==3){
return 3;
}
int krret=getPass(k.right,p,q);
if(krret==3){
return 3;
}
if(klret+krret==3){
retNode=k;
return 3;
}
return klret+krret;
}
}
同样的思想,我咋就少考虑一步呢?郁闷