面试热题(二叉树的最近公共祖先)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

 

面试热题(二叉树的最近公共祖先)_第1张图片

 二叉树的最近公共祖先,这道题无非就是将树进行递归查找

情况一:当前节点,左树和右树都有分别都有p、q

面试热题(二叉树的最近公共祖先)_第2张图片

 情况二:当前节点,p、q都在其左树上

面试热题(二叉树的最近公共祖先)_第3张图片

 情况三:当前节点,p、q都在其右树上

面试热题(二叉树的最近公共祖先)_第4张图片

情况四:p在q的子树

面试热题(二叉树的最近公共祖先)_第5张图片

情况五:q在p的子树

面试热题(二叉树的最近公共祖先)_第6张图片

 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //入参进行判断
        if(root==null){
            return null;
        }
        //如果先进来的是p或者q,那肯定是父节点,直接返回
        if(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;
      }
      //两个都在右边
      if(right!=null){
          return right;
      }
      return null;
    }

你可能感兴趣的:(热题Hot100,面试,职场和发展)