【Leetcode】235. Lowest Common Ancestor of a Binary Search Tree 解题报告

【Leetcode】235. Lowest Common Ancestor of a Binary Search Tree 解题报告
求二叉排序中的最近公共祖先

方法1 递归法

找到一个节点的值大于左变小于右边即可

class Solution1(object):
    def lowestCommonAncestor(self, root, p, q):
        p = p.val
        q = q.val
        if q < p:
            q,p = p,q
        return  self.find(root, p, q)
    def find(self, root, p, q):
        if root == None:
            return None
        if root.val >=p and root.val <= q:
            return root
        else:
            if root.val > q:
                return self.find(root.left, p, q)
            if root.val < p:
                return self.find(root.right, p, q)

方法2

递归转非递归使用栈

class Solution2(object):
    def lowestCommonAncestor(self, root, p, q):
        p , q = p.val, q.val
        if p > q:
            p,q = q,p
        if root == None:
            return None
        stack = [root]
        while(len(stack)):
            node = stack.pop()
            if node.val >= p and node.val <= q:
                return node
            else:
                if node.val > q:
                    stack.append(node.left)
                if node.val < p:
                    stack.append(node.right)
        return None

方法3

不使用栈的递归,直接用指针遍历即可

class Solution3(object):
    def lowestCommonAncestor(self, root, p, q):
        p, q = p.val, q.val
        if p > q:
            p, q = q, p
        if root == None:
            return None
        pNode = root
        while(pNode):
            if pNode.val >= p and pNode.val <= q:
                return pNode
            else:
                if pNode.val > q:
                    pNode = pNode.left
                else:
                    pNode = pNode.right
        return None