直接使用图中的节点父子关系循环遍历,不像之前那样在数组内操作排序。

import random

from binarytree import build, get_parent


def app():
    data = []
    SIZE = 10
    for i in range(SIZE):
        data.append(i)
    random.shuffle(data)

    my_tree = build(data)
    print(my_tree)
    print('是小顶堆吗?', my_tree.is_min_heap)

    print('-----')

    while not ok(my_tree):
        adjust(my_tree)

    print(my_tree)
    print('是小顶堆吗?', my_tree.is_min_heap)


def adjust(my_tree):
    nodes = my_tree.levelorder

    while len(nodes) != 0:
        node = nodes.pop()

        p = get_parent(my_tree, node)
        left = node.left
        right = node.right

        if left is not None:
            if left.value < node.value:
                swap(left, node)

        if right is not None:
            if right.value < node.value:
                swap(right, node)

        if p is not None:
            if node.value < p.value:
                swap(node, p)


def ok(my_tree):
    nodes = my_tree.levelorder

    done = True
    while len(nodes) != 0:
        p = nodes.pop()

        left = p.left
        right = p.right

        if left is not None:
            if p.value > left.value:
                done = False
                break

        if right is not None:
            if p.value > right.value:
                done = False
                break

    return done


# 交换节点的值
def swap(a, b):
    t = a.value
    a.value = b.value
    b.value = t


if __name__ == '__main__':
    app()

输出:


        ____4__
       /       \
    __0__       1
   /     \     / \
  8       6   5   9
 / \     /
7   2   3

是小顶堆吗? False
-----

        ____0__
       /       \
    __1__       4
   /     \     / \
  2       3   5   9
 / \     /
7   8   6

是小顶堆吗? True

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐