/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//本题需要利用二叉树的回溯,而后序遍历本身就是天然的回溯,从底向上遍历
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == p || root == q || root == null) return root;
//求出当前节点的左子树和右子树的公共祖先节点
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
//如果左右子树的公共祖先节点都为空,说明当前节点左右子树无公共祖先节点,没找到节点pq。
if(left == null && right == null) {
return null;
//如果right不为空,说明当前节点右子树的最大公共祖先节点为right,直接返回该节点,左子树同理
//找到一个节点的情况
}else if (left == null && right != null) {
return right;
}else if (left != null && right == null) {
return left;
}else {
//找到两个节点的情况。
//if(left != null && right != null)
//即当左右子树都有最大公共祖先节点的时候,当前节点是最大公共祖先节点。
return root;
}
}
}