【问题标题】:Binary Tree in Python, control over the heightPython中的二叉树,控制高度
【发布时间】:2022-01-18 19:16:50
【问题描述】:

我想在 Python 中实现一个二叉树。我总结了我的代码。我想做的是 用变量 L 设置二叉树的高度。但是,当我实现代码时,似乎代码创建了一个比我预期的更大的二叉树。 我得出这个结论是因为当我将高度设置为 1 并执行 print(node.right.right.right) 时,我仍然得到 1。

class Tree:
    def __init__(self,x,left=None,right=None):
      self.x=x
      self.left=left
      self.right=right 
    
    def one_tree(self,node):
        node=Tree(1)
        node.right=Tree(1)
        node.left=Tree(1)
        return node
        


node=Tree(1)
node=node.one_tree(node)
L=1

while L>0:
    node=node.one_tree(node)
    node.left=node
    node.right=node
    L=L-1

print(node.right.right.right.right)

【问题讨论】:

  • 令人困惑。在while 循环中,您创建一个Tree 并将其leftright 分配给它自己。 one_tree() 到底应该做什么?

标签: python tree binary height


【解决方案1】:

几个问题:

  • one_tree 不使用您作为参数传递的node,因此无论您传递给它什么,返回的树都将始终有 3 个节点(一个根有 2 个子节点)。

  • one_tree是一个没有使用self的方法,所以它确实应该是类方法,而不是实例方法

  • 如果预期的算法是在已创建的树上方添加一个级别,并让新根的子节点引用已存在的树,那么您只需要创建 一个 em> 节点,而不是三个,让两个孩子成为给定的节点。

  • 没问题,但你的循环并不是真正循环L 次的“python 方式”。请改用range

这意味着您的代码可能是这样的:

class Tree:
    def __init__(self, x, left=None, right=None):
        self.x = x 
        self.left = left
        self.right = right


node = Tree(1)
L = 1
for _ in range(L):
    node = Tree(1, node, node)

现在您仍然应该小心这棵树,因为它只有 L+1 唯一节点实例,其中同一级别上的所有“节点”实际上都是 same 节点实例。其余的都是引用,它们给人的“印象”是拥有一棵具有更多节点的树。每当您开始对该树中的节点进行变异时,您都会看到不希望的效果。

如果您确实需要为所有节点提供单独的节点实例,则需要调整算法。然后你可以使用递归:

def create(height):
    if height == 0:  # base case
        return Tree(1)
    return Tree(1, create(height-1), create(height-1))

L = 1
node = create(L)

【讨论】:

    【解决方案2】:

    我发现您的代码有问题。 one_tree 方法会覆盖参数 node 本身。

    class Tree:
        def __init__(self, x, left=None, right=None):
            self.x = x
            self.left = left
            self.right = right 
        
        def one_tree(self, node):
            node = Tree(1) # This assignment statement overwrites the argument 'node'.
            node.right = Tree(1)
            node.left = Tree(1)
            return node
    

    one_tree 方法得到一个参数node,但是这个方法的第一行像node = Tree(1) 一样覆盖了它。无论该方法获得什么作为参数,该方法总是有一个 Tree 的新实例作为 node 变量。

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多