# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.12 如何在二叉排序树中找出第一个大于中间值的结点
题目:
对于一棵二叉排序树,令f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的
结点。例如: 下图所给定的二叉排序树种,最大值为7,最小值为1,因此,
f=(1+7)/2=4,那么在这颗二叉树中,距离结点4最近并且大于4的结点为5.
4
2 6
1 3 5 7
分析:
二叉排序树的最左边孩子应该是最小的,最右边的孩子是最大的。
分别需要用两次遍历可以获取。
解决了这个问题,接下来就是求大于f且最近的结点,只需要遍历一次即可
问题的关键,首先为了确认值f肯定
关键:
参考:
Python程序员面试算法宝典
'''
class BinaryTreeNode(object):
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def buildTree(data, begin, end):
if not data:
return
if begin > end:
return
elif begin == end:
return BinaryTreeNode(data[begin])
size = end - begin + 1
middle = size / 2 + begin
root = BinaryTreeNode(data[middle])
left = buildTree(data, begin, middle - 1)
right = buildTree(data, middle + 1, end)
root.left = left
root.right = right
return root
def findMinAndMax(root):
if not root:
return
minimum = None
rootCopy = root
while root:
minimum = root.data
root = root.left
root = rootCopy
maximum = None
while root:
maximum = root.data
root = root.right
return minimum, maximum
def find(root, middle):
if not root:
return
if middle is None:
return
result = None
while root:
if root.data <= middle:
root = root.right
else:
root = root.left
if root:
result = root
return result
def process():
data = list(range(1, 8))
root = buildTree(data, 0, len(data) - 1)
minimum, maximum = findMinAndMax(root)
print minimum
print maximum
middle = (minimum + maximum) / 2
result = find(root, middle)
print result.data
if __name__ == "__main__":
process()