思路:
将tree的条件放宽,不再是BST。一个方法是分别找到从root到node1和node2的路径,记作path1和path2,然后比较path1和path2,两条路径上最后一个相同的节点就是所谓的LCA(Lowest Common Ancestor)。
java code:
private boolean getPath(TreeNode cur, TreeNode target, List<TreeNode> list) {
if(cur == target) return true;
if(cur.left != null) {
list.add(cur.left);
if(getPath(cur.left, target, list)) {
return true;
}
list.remove(cur.left);
}
if(cur.right != null) {
list.add(cur.right);
if(getPath(cur.right, target, list)) {
return true;
}
list.remove(cur.right);
}
return false;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return null;
List<TreeNode> treeNodeList1 = new ArrayList<TreeNode>();
List<TreeNode> treeNodeList2 = new ArrayList<TreeNode>();
//construct two path
treeNodeList1.add(root);
treeNodeList2.add(root);
getPath(root, p, treeNodeList1);
getPath(root, q, treeNodeList2);
//compare two path to find the last common node
TreeNode ans = null;
for(int i = 0; i < treeNodeList1.size() && i < treeNodeList2.size(); ++i) {
if(treeNodeList1.get(i) == treeNodeList2.get(i)) {
ans = treeNodeList1.get(i);
}else {
break;
}
}
return ans;
}
寻找二叉树中最近公共祖先
本文介绍了一种寻找二叉树中两个指定节点最近公共祖先(LCA)的方法,通过构建从根节点到目标节点的路径并比较路径来确定LCA。文中提供了一个Java实现示例。
96

被折叠的 条评论
为什么被折叠?



