// 遞歸終止條件厨剪,當(dāng)前節(jié)點(diǎn)為p或者q或者為null底靠,當(dāng)前節(jié)點(diǎn)一定為最小公共祖先突硝,直接返回
if (root == p || root == q || root == null) {
return root;
}
// 在左子樹中找p或者q
TreeNode left = lowestCommonAncestor(root.left, p, q);
// 在右子樹中找p或者q
TreeNode right = lowestCommonAncestor(root.right, p, q);
// 如果左子樹中沒有p和q雁社,則最小公共祖先一定在右子樹
// 如果右子樹中沒有p和q,則最小公共祖先一定在左子樹
// 如果左右子樹中分別又p和q久脯,則最小公共祖先為當(dāng)前的root節(jié)點(diǎn)
return left == null ? right : right == null ? left : root;
// p節(jié)點(diǎn)小于root節(jié)點(diǎn)纳胧,q節(jié)點(diǎn)大于root節(jié)點(diǎn),說明root在二者中間帘撰,一定為最小公共祖先
if (root.val > p.val && root.val < q.val) {
return root;
}
// p和q節(jié)點(diǎn)均大于root節(jié)點(diǎn)跑慕,說明p和q都在右子樹
if (root.val < p.val && root.val < q.val) {
return lowestCommonAncestor(root.right, p, q);
}
// p和q節(jié)點(diǎn)均小于root節(jié)點(diǎn),說明p和q都在左子樹
if (root.val > p.val && root.val > q.val) {
return lowestCommonAncestor(root.left, p, q);
}
// p和q有任一節(jié)點(diǎn)等于root節(jié)點(diǎn)摧找,則當(dāng)前節(jié)點(diǎn)一定是最小公共祖先
return root;