算法_二叉树_二叉搜索树的最近公共祖先

文章目录

  • 二叉搜索树的最近公共祖先
    • 1.解法
    • 2.总结

二叉搜索树的最近公共祖先

leetcode链接

1.解法

其实这道题思路还是很简单,就是不好用语言描述出来,只可意会不可言传,但我还是尽我最大可能把这道题的思路用语言表达出来,帮助大家理解。

假设:p为较小值的节点,q为较大值的节点

思路:因为题目中给的是二叉搜索树,所以根据二叉搜索树的性质:每个节点的左子树的所有节点的值都小于该节点的值,右子树的所有节点的值都大于该节点的值。

结合最近公共节点的性质:对于最近公共节点而言,只要该节点的左子树中有p,右子树中有q,(p、q不能同时在左子树或者右子树),那么该节点就是他们的最近公共节点。

所以由此可以推出:p和q的最近公共祖先的值的取值范围为[p.val,q.val]。

遍历方法:那么以下图为例,求3和7的最近公共节点,如果我们选择从下往上遍历(以中序遍历为例),那么第一个找到的在[3,7]之间的值是4,4肯定不是他们的最近公共节点,问题出在哪了呢?

对于这棵二叉搜索树,我们给出他的中序遍历[0,2,3,4,5,6,7,8,9],想象二叉搜索树的构造过程,构造一棵树的时候是从上向下,先给出一个值作为根节点然后再给出一个节点,如果小于则放到左子树,大于放到右子树,重复步骤直到构造完成。

对于这样一个序列我们可以构造无数种二叉搜索树,所以每棵二叉搜索树的结构不同,就导致了他们的最近公共节点不同,对于以[0,2,3,4,5,6,7,8,9]这个序列构造的其他的二叉搜索树而言,4有可能是3,7的最近公共节点,但在这棵树里不是。

所以要在这棵二叉搜索树中进行查找最近公共节点,我们就要遵从他的构造规则,所以我们要采用从上向下遍历,这样遇到的第一个在[3,7]之间的值就是他们的最近公共祖先。(就是这句话不太好用语言表达出来,需要意会)
算法_二叉树_二叉搜索树的最近公共祖先_第1张图片

所以我们只需要采用前序遍历节点,第一个遇到的节点的值如果在**[p.val,q.val]**范围内,那么该节点就是他们的最近公共节点。

代码如下:

def lowestCommonAncestor(root, p, q):
    if not root:
        return None

    # 中
    if root.val>=min(p.val,q.val) and root.val<=max(p.val,q.val):
        return root
    # 左
    elif root.val>max(p.val,q.val):
        return lowestCommonAncestor(root.left,p,q)
    # 右
    elif root.val<min(p.val,q.val):
        return lowestCommonAncestor(root.right,p,q)

2.总结

二叉搜索树的题一般都比同样类型的二叉树的题要简单的多。

你可能感兴趣的:(算法,算法,leetcode,c++)