【问题标题】:BST-analogous structure element insertion recursivelyBST-类似结构元素递归插入
【发布时间】:2021-12-11 23:33:20
【问题描述】:

我想知道为什么作者不会简单地编写以下代码而不是原始代码。我做了很多测试,以免错过任何一个案例。因此,它按预期工作。是关于时间复杂度的吗?我错过了哪些要点或细微差别?

将元素视为 [key,value,left-node,right-node]

// my simplification
def insert_binary_tree(x, T):
  if T == []:
      T.extend([x[0], x[1], [], []])
  else:
      if x[0] < T[0]:
          insert_binary_tree(x, T[2])
      else:
          insert_binary_tree(x, T[3])

原始代码

def insert_binary_tree(x, T):
    if T == []:
        T.extend([x[0], x[1], [], []])
    else:
        if x[0] < T[0]:
            if T[2] == []:
                T[2] = [x[0], x[1], [], []]
            else:
                insert_binary_tree(x, T[2])
        else:
            if T[3] == []:
                T[3] = [x[0], x[1], [], []]
            else:
                insert_binary_tree(x, T[3])

示例运行,

t = ['Emma', '2002/08/23',
['Anna', '1999/12/03', [], []],
['Paul', '2000/01/13',
['Lara', '1987/08/23',
['John', '2006/05/08', [], []],
['Luke', '1976/07/31', [], []]],
['Sara', '1995/03/14', [], []]]]

def insert_binary_tree(x, T):
  if T == []:
      T.extend([x[0], x[1], [], []])
  else:
      if x[0] < T[0]:
          insert_binary_tree(x, T[2])
      else:
          insert_binary_tree(x, T[3])


print(t)
insert_binary_tree(['Abba', '1111/11/11', [], []], t)
print(t)

【问题讨论】:

  • 一个原因可能是,如果T[2] 是一个仍在其他地方引用的节点,那么由于.extend 突变,该节点也会发生变化。原始代码只会替换那个孩子,其他引用不会受到影响。

标签: python algorithm recursion binary-search-tree


【解决方案1】:

唯一的原因可能是对象之间更大的独立性。通过稍微改变输入来比较两个代码:

empty = []

t = ['Emma', '2002/08/23',
['Anna', '1999/12/03', empty, empty],
['Paul', '2000/01/13',
['Lara', '1987/08/23',
['John', '2006/05/08', empty, empty],
['Luke', '1976/07/31', empty, empty]],
['Sara', '1995/03/14', empty, empty]]]

现在,原始代码仍然可以工作,但您的代码不行。您仍然可以简化它,同时保持对空列表的独立引用:

def insert_binary_tree(x, T):
    if T == []:
        T.extend([x[0], x[1], [], []])
    else:
        child = 2 + (x[0] >= T[0])
        if T[child]:
            insert_binary_tree(x, T[child])
        else:
            T[child] = x[:2] + [[], []]  
            # again trying to avoid mutable list references

【讨论】:

  • 你所说的“更大的独立性”是什么意思?
  • 您是否针对我提供的输入测试了这两种实现?由于所有空子项都指向同一个虚拟/默认空列表,因此应用变异 extend() 操作将更改所有子项!原始代码只会在正确的位置插入一次。
  • 我仍然不明白为什么所有空节点都被替换了。你能解释一下吗?我不只是改变价值吗?它的行为不像参考更改吗?
  • 由于递归调用insert_binary_tree(x, T[2]) 中的T.extend(...),您改变了一个空列表对象。如果您改为使用T[2] = [...],则之前引用的任何对象T[2] 都不会受到伤害。
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2023-03-19
  • 2014-04-24
  • 2020-03-05
相关资源
最近更新 更多