【问题标题】:Deleting the smallest element in a binary tree删除二叉树中的最小元素
【发布时间】:2016-03-18 12:30:33
【问题描述】:

如何删除二叉树中最小的元素?当他们要求您删除某个元素时,我知道如何删除,但我真的被这个元素难住了。这是删除树中特定值的代码。

def delete(tree):
    if tree == None:
        return None
    else:
        if tree['left']['left'] == None:
            tree['left'] = None
         #this is where I get stuck

【问题讨论】:

  • 你试过什么?你在哪部分有问题?你能找到最小的元素吗?你知道如何遍历二叉树的所有元素吗?
  • @timgeb 我尝试遍历左侧,但我在实际删除节点时遇到了麻烦,因为有一个值,我实际上可以说'嘿,沿着树向下,找到这个元素并删除它'我尝试让它遍历树的左侧并找到叶子并删除它,但它没有工作
  • 首先,代码在语法上不正确。其次,当前面的条件为假时,围绕你的第一个 else 的 cmets 是关于树结构的不正确理由。
  • @Qman485 听起来您在评论中所说的方法朝着正确的方向发展。你能为此提供你的代码吗?在什么情况下它不起作用?
  • @kjschiroo 我已经更新了代码,我只是无法理解整个过程,想知道如何一直到最后一片叶子

标签: python algorithm tree binary-tree min


【解决方案1】:

我建议使用the heapq implementation provided in the Python standard library,直接完成从二叉树中去除最小值的任务,然后研究the source code of the heapq module以了解算法是如何实现的。

import heapq
from random import seed, randint

seed(0)
items = [randint(1,100) for i in range(10)]
# [85, 76, 43, 26, 52, 41, 79, 31, 48, 59]

# create the heap queue / priority queue
h = []
for i in items:
    heapq.heappush(h, i)

# the smallest item
heapq.heappop(h)
# 26

【讨论】:

    【解决方案2】:

    在我看来,您只是忘了包含递归步骤。我已将其包含在下面的代码中。

    def delete(tree):
        if tree == None:
            return None
        else:
            if tree['left']['left'] == None:
                tree['left'] = tree['left']['right'] # I also changed this
            else:
                delete(tree['left']) # recursive part
    

    如果您知道tree['left']['left'] != None 的最小值在树的左侧更远的某个位置,那么只需在该侧再次调用delete(),直到我们找到tree['left']['left'] == None 所在的节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多