求一颗任意树(不一定是二叉树)所有最深叶子节点(数量可以是大于等于1的任意值,取决于树的结构)的最深公共前驱节点。
例子:
![](http://www.1point3acres.com/bbs/data/attachment/forum/201511/18/113411ilvh6hv62l2v234q.png)
![](http://www.1point3acres.com/bbs/data/attachment/forum/201511/18/113455ijruow0srzl9sjus.png)
.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�
如图的树中,返回的都是红色的节点。
package tree;
import java.util.ArrayList;
public class LowestCommonPreAncestor {
public static TreeNode find(TreeNode root) {
if (root == null || root.children.isEmpty())
return root;
return helper(root).node;
}
public static Result helper(TreeNode root) {
if (root.children.isEmpty())
return new Result(root, 1);
int size = root.children.size();
int maxDepth = Integer.MIN_VALUE;
Result r = new Result(root, maxDepth);
for (int i = 0; i < size; i++) {
Result tmp = helper(root.children.get(i));
if (tmp.maxDepth > maxDepth) {
maxDepth = tmp.maxDepth;
r.node = tmp.node;
r.maxDepth = tmp.maxDepth + 1;
}
else if (tmp.maxDepth == maxDepth) {
r.node = root;
}
}
return r;
}
public static void main(String[] args) {
TreeNode n1 = new TreeNode(1);
TreeNode n2 = new TreeNode(2);
TreeNode n3 = new TreeNode(3);
TreeNode n4 = new TreeNode(4);
TreeNode n5 = new TreeNode(5);
TreeNode n6 = new TreeNode(6);
TreeNode n7 = new TreeNode(7);
TreeNode n8 = new TreeNode(8);
TreeNode n9 = new TreeNode(9);
TreeNode n10 = new TreeNode(10);
n1.children.add(n2);
n1.children.add(n3);
n1.children.add(n4);
n2.children.add(n5);
n2.children.add(n6);
n4.children.add(n7);
n5.children.add(n8);
n5.children.add(n9);
n6.children.add(n10);
TreeNode res = find(n1);
System.out.println(res.val);
}
}
class TreeNode {
int val;
ArrayList<TreeNode> children;
public TreeNode(int val) {
this.val = val;
children = new ArrayList<>();
}
}
class Result {
TreeNode node;
int maxDepth;
public Result(TreeNode node, int maxDepth) {
this.node = node;
this.maxDepth = maxDepth;
}
}