题解 | #在二叉树中找到两个节点的最近公共祖先#

在二叉树中找到两个节点的最近公共祖先

http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116

最直观的解法

要求最近的祖先,首先定义一个求val在root节点左子树或右子树的函数。对于val1,val2

  1. 若一个在左子树,一个在右子树,显然root即为最近祖先

  2. 若val1,val2中有一个在root上,即root.val=val1 or val2.显然root为最近祖先

  3. 最坏的情况,val1,val2在同一棵子树上,我们则将root设置为root.left或root.right,进行循环判断

 public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        // write code here
        while(root!=null)
        {
          int l = iswhere(root,o1);
          int r = iswhere(root,o2);
          //在同一子树上或一个即为root
          if(l!=r||l==0||r==0) return root.val;
          //都在左子树,继续找
           else if(l<0) root =root.left;
            //都在右子树,继续找
           else root =root.right;
        }
        //永远不会返回99,为了防止报错
        return 99;
        
    }
public int iswhere(TreeNode root,int val)
{
    //求val在root的左子树或右子树
    //-1:左子树  1:右子树
    //0:val在根节点root.val上  -2:不在这棵树上
    if(root == null) return -2;
    if(root.val == val) return 0;
    
    if(iswhere(root.left,val)==-2)
    {
        if(iswhere(root.right,val)==-2)
           return -2;
        else return 1;
    }
    else return -1;    
}

}

全部评论

相关推荐

点赞 评论 收藏
分享
牛客154160166号:9月底还给我发短信,好奇怪,我24届的
点赞 评论 收藏
分享
美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务