【问题标题】:Binary Tree: How Do Class Instances Link?二叉树:类实例如何链接?
【发布时间】:2018-01-17 20:10:23
【问题描述】:

我正在尝试理解二叉树,但这样做让我对类实例如何交互、每个实例如何链接到另一个实例感到困惑?

我的实现:

class Node(object):
    def __init__(self, key):
        self.key= key
        self.L  = None
        self.R  = None



class BinaryTree(object):
    def __init__(self):
        self.root = None

    def get_root(self):
        return self.root

    def insert(self, key):
        if self.get_root()==None:
            self.root = Node(key)
        else:
            self._insert(key, self.root)

    def _insert(self, key, node):
        if key < node.key:
            if node.L == None:
                node.L = key
            else: 
                self._insert(key, Node(node.L))
        if key > node.key:
            if node.R == None:
                node.R = key
            else: 
                self._insert(key, Node(node.R))

myTree= BinaryTree()

一个场景

假设我想插入 10,我做 myTree.insert(10),这将实例化 Node() 的新实例,这对我来说很清楚。

现在我想加11,我希望这成为根节点的右节点;即它将存储在根节点Node() 的属性R 中。

现在我不明白的部分来了。当我添加 12 时,它应该成为根节点右孩子的孩子。在我的代码中,这会创建一个Node() 的新 实例,其中11 应该是key,12 应该是R。

所以我的问题有两个:Node() 的最后一个实例会发生什么?如果没有,它会被删除吗?我如何访问它?

或者是一个二叉树的结构,可以抽象为每个Node() 像在图中一样连接在一起

注意:这个实现很大程度上来自 djra 的实现,来自这个问题How to Implement a Binary Tree?

【问题讨论】:

    标签: python class data-structures binary-tree nodes


    【解决方案1】:

    将 L 和 R 设为 Nodes 而不是 ints。您可以通过更改 _insert 函数的部分来做到这一点:

    if node.L == None:
        node.L = key
    

    到这里:

    if node.L == None:
        node.L = Node(key)
    

    这行也有问题:

    self._insert(key, Node(node.L))
    

    按照您现在的操作方式,无法访问 Node() 的最后一个引用,因为您的 _insert 函数将它插入到没有父节点的匿名构造节点下,因此不是你的树的一部分。传递给您的插入函数的那个​​节点不是树中任何其他节点的L 或R,因此您实际上并没有向树中添加任何内容。

    现在我们将Ls 和Rs 更改为Nodes,您可以将作为树的一部分的节点传递给插入函数:

    self._insert(key, node.L)
    

    现在您将节点的左子节点传递到递归插入中,这看起来就是您最初尝试做的。

    一旦您在代码中对L 和R 插入案例进行了这些更改,您就可以在您的

    中找到Node() 的最后一个实例
    10
      \
       11
         \
          12
    

    示例树通过myTree.root.R.R。你可以通过myTree.root.R.R.key得到它的key,等于12。

    【讨论】:

    • 感谢您扩展您的原始帖子;可以肯定的是,最右边的node 的身份是 myTree.root.R.R*(n-2).key?
    • 你可以使用递归来找到最右边的节点,类似于你为插入所做的。您可以定义一个接收节点的函数,如果它的R 是None,则返回节点的键,或者如果节点的R 不是None,则在节点的R 中进行递归函数调用.然后,当你调用这个传入根节点的函数时,该函数将转到根的右孩子,然后是根的右孩子的右孩子,以此类推,直到它不能再向右,此时它返回键最右边的节点
    【解决方案2】:

    你们中的大多数问题来自于没有完成程序;在myTree.insert(11) 之后的当前代码中,您的树将 R 设置为等于 int 而不是另一个 Node。

    如果未找到该值,则在该点创建新节点。否则将下一个节点传递给递归函数以继续向下移动。

    def _insert(self, key, node):
        if key < node.key:
            if node.L == None:
                node.L = Node(key)
            else: 
                self._insert(key, node.L)
        if key > node.key:
            if node.R == None:
                node.R = Node(key)
            else: 
                self._insert(key, node.R)
    

    附:这还没有完成,您将需要另一个级别的逻辑测试,以防某些东西比当前的 Node.key 大但比下一个 Node 小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 2015-05-27
      • 2011-02-05
      • 2012-01-09
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多