劍指offer【68】:二叉搜索樹的最近祖先節點

題目:

思路+代碼:

思路一:非遞歸迭代
           二叉樹節點值唯一,且爲二叉搜索樹
           非遞歸寫法:
           所以根據值大小不斷從根節點,往下一層判斷;直到p,q分佈在 子樹根節點的左右
                 時間複雜度:O(n),當二叉樹爲鏈表時,root爲某一個節點的直接根節點
                 空間複雜度:O(1)
思路二:遞歸寫法
           遞歸寫法
                 時間複雜度:O(n), 時間爲二叉搜索樹的層數( logn < layer < n)
                 空間複雜度:O(n), 遞歸層數最大爲n

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        
        # 二叉樹節點值唯一,且爲二叉搜索樹
        # 非遞歸寫法:
        # 所以根據值大小不斷從根節點,往下一層判斷;直到p,q分佈在 子樹根節點的左右
        #   時間複雜度:O(n),當二叉樹爲鏈表時,root爲某一個節點的直接根節點 
        #   空間複雜度:O(1)
        while root:
            if root.val > p.val  and root.val > q.val: 
                root = root.left
            elif root.val < p.val  and root.val < q.val:
                root = root.right
            else:
                break
        return root

        # 遞歸寫法
        #   時間複雜度:O(n), 時間爲二叉搜索樹的層數( logn < layer < n)
        #   空間複雜度:O(n), 遞歸層數最大爲n
        if root.val > p.val  and root.val > q.val: 
            return self.lowestCommonAncestor(root.left, p, q)
        if root.val < p.val  and root.val < q.val: 
            return self.lowestCommonAncestor(root.right, p, q)
        return root

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章