代码中的二叉树长这个样子↓↓↓
找到该树中两个指定节点的最近公共祖先,有三种情况,如图:
import java.util.*;
import java.util.Queue;
//下面的所有求结点总数的,和求叶子结点个数的题,均使用的遍历方法是前序遍历
class Node{
public char val;
public Node left;//左孩子
public Node right;//右孩子
public Node(char val){
this.val=val;
}
}
public class BinaryTree {
/*private static class Node { //这些参数定义在在类方法外或者内都可以,只是有些需稍加修改
char val;
Node left;
Node right;
public Node(char val) {
this.val = val;
}
}*/
// 1、构造二叉树
public Node buildTree(){
Node A=new Node('A');
Node B=new Node('B');
Node C=new Node('C');
Node D=new Node('D');
Node E=new Node('E');
Node F=new Node('F');
Node G=new Node('G');
Node H=new Node('H');
A.left=B;A.right=C;B.left=D;B.right=E;//这里是构造二叉树的关键
C.left=F;C.right=G;E.right=H;
return A;
}
//找两个结点最近的公共祖先
public Node lowstCommonAncestor(Node root,Node p,Node q){
if(root==null){
return null;
}
if(root==p||root==q){
return root;
}
Node left=lowstCommonAncestor(root.left,p,q);
Node right=lowstCommonAncestor(root.right,p,q);
if(left!=null&&right!=null){
return root;
}else if(left!=null){
return left;
}else{
return right;
}
}
public static void main(String[] args) {
BinaryTree binaryTree=new BinaryTree();
Node root=binaryTree.buildTree();
System.out.println("找两个结点最近的公共祖先:"+binaryTree.lowstCommonAncestor(root,root.left,root.right.left));//这里打印出的是地址,可推理该公共祖先是A
System.out.println(root);//这个是根即A的地址,两者比较会发现是一致的
}
}
执行结果: