題目:
思路+代碼:
思路一:非遞歸迭代
二叉樹節點值唯一,且爲二叉搜索樹
非遞歸寫法:
所以根據值大小不斷從根節點,往下一層判斷;直到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