Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.12 如何在二叉排序树中找出第一个大于中间值的结点

# -*- 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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值