剑指offer-50-树中两个节点的最低公共祖先-java

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 09:12   32   0

题目及测试

package sword050;
/*题目:求树中两个结点的最低公共祖先
*/
public class main {
 
 public static void main(String[] args) {
  Object[] x=new Object[]{3,5,1,6,2,0,8,null,null,7,4}; 
  BinaryTree tree=new BinaryTree(x);
  tree.printTree(tree.root);
  test(tree.root,tree.root.left,tree.root.right);
  
  test(tree.root,tree.root.left,tree.root.left.right.right);
 }
   
 private static void test(TreeNode ito,TreeNode ito2,TreeNode ito3) {
  Solution solution = new Solution();
  TreeNode rtn;
  long begin = System.currentTimeMillis();
  rtn = solution.lowestCommonAncestor(ito,ito2,ito3);//执行程序
  long end = System.currentTimeMillis();  
  System.out.println("rtn=" );
  System.out.print(rtn.val);
  System.out.println();
  System.out.println("耗时:" + (end - begin) + "ms");
  System.out.println("-------------------");
 }

}

解法1(成功)

如果是二叉搜索树的话,我们只需从根结点判断,如果二结点与根的左右子树比较一大一小,那么跟结点就是二者最低公共祖先;如果二结点都比左子结点小,向左子树递归进行比较;如果二结点都比右子树结点大,向右子树递归进行比较;

如果不是二叉搜索树,但带有指向父节点的指针,那么此题转换成在两个有相交的链表上求第一个相交点。

如果不带指向父节点的指针,那么我们可以记录从根结点到这两个结点的路径即可求出。

package sword050;

import java.util.HashSet;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
  HashSet<TreeNode> pParent = new HashSet<TreeNode>();
  HashSet<TreeNode> qParent = new HashSet<TreeNode>();
  pParent.add(p);
  qParent.add(q);
  while(true) {
   if(qParent.contains(p)) {
    return p;
   }else {
    if(p != root) {
     p = p.parent;
     pParent.add(p);
    }    
   }
   
   if(pParent.contains(q)) {
    return q;
   }else {
    if(q != root) {
     q = q.parent;
     qParent.add(q);
    }    
   }
   
  }

    }
 
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP