二分查找,二叉搜索树寻找最近祖先均是典型分治问题,把原问题分成三部分考虑,递归实现简单,迭代实现也比较简单,里面蕴含了一些从从递归到迭代的技巧,注意这里没有使用模拟栈技术。
深究其原因是,这一类型的递归,每次查找丢弃了一半,递归到底部就找到了问题的解,搜索到最小子问题就解决了问题,类似于分支限界剪枝,剪到最后就是问题的解,不需要一层一层的回退,也就没有必要使用栈来恢复现场。
二分查找,递归和迭代
def binary_Serach_recursive(arr,left,right,target):
middle = (left + right) // 2
if left > right :
return(-1)
if arr[middle] == target:
return(middle)
elif arr[middle] < target:
return binary_Serach_recursive(arr,middle+1,right,target)
else:
return binary_Serach_recursive(arr,left,middle-1,target)
def binary_Serach_iterative(arr,target):
left = 0
right = len(arr)-1
while left <= right:
middle = (left + right) // 2
if arr[middle] == target:
return middle
elif arr[middle] < target:
left = middle +1
else:
right = middle -1
return -1
二叉搜索树寻找最近祖先,递归和迭代
def lowestCommonAncestor(self, root, p, q):
if root.data < p and root.data < q:
return self.lowestCommonAncestor(root.right, p, q)
elif root.data > p and root.data > q:
return self.lowestCommonAncestor(root.left, p, q)
else:
return root
def lowestCommonAncestorRecursion(self, root, p, q):
pointer = root
while pointer:
if pointer.data < p and pointer.data < q:
pointer = pointer.right
elif pointer.data > p and pointer.data > q:
pointer = pointer.left
else:
return pointer