大概分为两种情况,一种是pq两个节点在树或者子树的同一边
package test;
public class SmallCommonParent {
public static void main(String[] args) {
/*
* 第一种情况,p和q在root的两边
* root
* / \
* p a
* \
* q
* */
// TreeNode p = new TreeNode("p");
// TreeNode q = new TreeNode("q");
// TreeNode a = new TreeNode("a",null,q);
// TreeNode rootNode = new TreeNode("root", p, a);
/*
* 第二种情况,p和q在root的同一边
* root
* / \
* a p
* / \
* b q
* */
TreeNode q = new TreeNode("q");
TreeNode p = new TreeNode("p",null,q);
TreeNode b = new TreeNode("b");
TreeNode a = new TreeNode("a",b,null);
TreeNode rootNode = new TreeNode("root", a, p);
TreeNode loNode = lowestCommonAncestor(rootNode, p, q);
System.out.println("获取到的最近的父节点:" + loNode.getNodeName());
}
public static 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;
}
}
static class TreeNode {
private String nodeName;
private TreeNode left;
private TreeNode right;
public TreeNode(String nodeName, TreeNode left, TreeNode right) {
super();
this.nodeName = nodeName;
this.left = left;
this.right = right;
}
public TreeNode(String nodeName) {
this.nodeName = nodeName;
}
public String getNodeName() {
return nodeName;
}
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
}
}