最近公共祖先和o1,o2有三种关系:
- o1,o2分别在祖先左右两侧
- 祖先是o1,o2在祖先左/右侧
- 祖先是o2,o1在祖先左/右侧
使用dfs深度遍历,如果节点为o1,o2中其中一个直接返回,如果节点超过叶子节点也返回
public int lowestCommonAncestor (TreeNode root, int o1, int o2) { return CommonAncestor(root, o1, o2).val; } public TreeNode CommonAncestor (TreeNode root, int o1, int o2) { if (root == null || root.val == o1 || root.val == o2) { // 超过叶子节点,或者root为p、q中的一个直接返回 return root; } TreeNode left = CommonAncestor(root.left,o1,o2); // 返回左侧的p\q节点 TreeNode right = CommonAncestor(root.right,o1,o2); // 返回右侧的p\q节点 if (left == null) { // 都在右侧 return right; } if (right == null) { // 都在左侧 return left; } return root; // 在左右两侧 }