2023.4.5 二叉搜索树的公共祖先
235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)
普通的二叉树可以直接利用后序遍历来递归找对应节点,那么对于一个二叉搜索树,有什么可以利用其特性的地方?
首先最近公共祖先存在两种情况:
1.不是其本身节点:此时,其p,q节点一定是在祖先节点的左右子树中的,根据二叉搜索树的性质,其左子树的所有节点都小于根节点,右子树的所有节点都大于根节点,因此,从根节点开始遍历,此时第一次找到的节点是就是我们需要的,就是找到那个root.val 比其中一个大比另一个小的点,如果p,q不在根节点的左右子树里面,那么一定在其左子树的左右子树或者右子树的左右子树中。
2.如果公共节点就是其本身:这代表p,q节点在一条线上,此时会遍历到当前节点等于p或者q。
我们可以使用一个统一的公式来对上述两种情况进行判断
即(root.val-p.val)*(root.val-q.val)
如果不满足,即出现大于0的情况,此时存在两种可能
1:p,q在当前节点的左子树中,此时p,q的值都小于当前节点值,因此我们需要将当前节点向左子树移动。
2:p,q在当前节点的右子树中,此时p,q的值都大于当前节点值