方法一:自己写的,用后序遍历模式
方法二:别人写的,用后序遍历模式
[](()Submission
import com.lun.util.BinaryTree.TreeNode;
public class LowestCommonAncestorOfDeepestLeaves {
//方法一:自己写的,用后序遍历模式
public TreeNode lcaDeepestLeaves(TreeNode root) {
Object[] r 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 esult = lcaDeepestLeaves(root, 0);
return result != null ? (TreeNode)result[0] : null;
}
private Object[] lcaDeepestLeaves(TreeNode node, int depth) {
if(node == null) return null;
depth++;
Object[] leftResult = lcaDeepestLeaves(node.left, depth);
Object[] rightResult = lcaDeepestLeaves(node.right, depth);
if(leftResult == null && rightResult == null) {//叶子节点
return new Object[] {node, depth};
}else if(leftResult != null && rightResult == null){
return leftResult;
}else if(leftResult == null && rightResult != null) {
return rightResult;
}else {
int leftDepth = (int)leftResult[1];
int rightDepth = (int)rightResult[1];
if(leftDepth > rightDepth) {
return leftResult;
}else if(leftDepth < rightDepth) {
return rightResult;
}else {
leftResult[0] = node;
return leftResult;
}
}
}
//方法二:别人写的,用后序遍历模式
public TreeNode lcaDeepestLeaves2(TreeNode root) {
Pair p = getLca(root, 0);
return p.node;
}
private Pair getLca(TreeNode root, int d) {
if (root == null) return new Pair(null, d);
Pair l = getLca(root.left, d + 1);
Pair r = getLca(root.right, d + 1);
if (l.d == r.d) {
return new Pair(root, l.d);
} else {
return l.d > r.d ? l : r;
}
}
private class Pair {
TreeNode node;
int d;
Pair(TreeNode node, int d) {
this.node = node;
this.d = d;
}
}
}
[](()Test
import static org.junit.Assert.*;
import org.junit.Test;
import com.lun.util.BinaryTree;
import com.lun.util.BinaryTree.TreeNode;
public class LowestCommonAncestorOfDeepestLeavesTest {
@Test
public void test() {
LowestCommonAncestorOfDeepestLeaves lObj = new LowestCommonAncestorOfDeepestLeaves();
TreeNode root1 = BinaryTree.integers2BinaryTree(3,5,1,6,2,0,8,null,null,7,4);
TreeNode expected1 = BinaryTree.integers2BinaryTree(2,7,4);
assertTrue(BinaryTree.equals(lObj.lcaDeepestLeaves(root1), expected1));
TreeNode root2 = BinaryTree.integers2BinaryTree(1);
TreeNode expected2 = BinaryTree.integers2BinaryTree(1);
assertTrue(BinaryTree.equals(lObj.lcaDeepestLeaves(root2), expected2));
TreeNode root3 = BinaryTree.integers2BinaryTree(0,1,3,null,2);
TreeNode expected3 = BinaryTree.integers2BinaryTree(2);
assertTrue(BinaryTree.equals(lObj.lcaDeepestLeaves(root3), expected3));
}
@Test
public void test2() {
LowestCommonAncestorOfDeepestLeaves lObj = new LowestCommonAncestorOfDeepestLeaves();
TreeNode root1 = BinaryTree.integers2BinaryTree(3,5,1,6,2,0,8,null,null,7,4);