在Python中打印二进制树插入的每个阶段的最佳方法

时间:2013-03-29 03:25:54

标签: python oop python-2.7 binary-tree binary-search-tree

我尝试在插入的每个步骤后打印二进制搜索树的每个阶段。但是,我的代码生成的输出似乎错过了初始根数据插入步骤,并且还重复了某些阶段。我需要一个干净简单的方法来做到这一点。有没有办法使用__dict__.values()来做到这一点。

我的代码:

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def addNode(self, data):
        if data < self.data:
            if self.left is None:
                self.left = Node(data)
            else:
                self.left.addNode(data)  # recursively calling addNode method
        else:
            if self.right is None:
                self.right = Node(data)
            else:
                self.right.addNode(data)

        if not self.left is None and not self.right is None:
            print self.left.data, self.data, self.right.data
        elif self.left is None and not self.right is None:
            print None, self.data, self.right.data
        elif not self.left is None and self.right is None:
            print self.left.data, self.data, None

if __name__ == '__main__':
    n = Node(5)
    #print n.__dict__.values()
    n.addNode(3)
    n.addNode(2)
    n.addNode(8)
    n.addNode(4)

输出已生成:

3 5 None
2 3 None
3 5 None
3 5 8
2 3 4
3 5 8

预期输出:

None 5 None
3 5 None
2 3 None
3 5 8
2 3 4

2 个答案:

答案 0 :(得分:1)

由于您的设计方式,打印步骤发生在每个递归步骤,从内到外。因此,为了更有意义,让我们来看看。您n.addNode(3)给了我们

3 5 None

没有惊喜。但是当你说你期待的时候:

2 3 None

但得到两者,

2 3 None
3 5 None

因为n.addNode(2)要检查第一级(3 5 None)然后查看较低级别(data属性= 3的节点)。因此,“从内到外”打印,我们再次获得2 3 None(新子树),然后再获得第一级3 5 None。它的原因与你预期的一样,

2 3 4

你反而得到,

2 3 4
3 5 8

初始树(您期望None 5 None)未打印的事实是一个单独的问题。这只是因为您正在初始化data属性,并且因为您没有调用addNone而无法访问打印部分。

可能的解决方案(仍然维护您的结构)将仅在您将节点添加到树结构并手动打印初始子树时进行打印。也许写下这样的东西:

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def addNode(self, data):
        if data < self.data:
            if self.left is None:
                self.left = Node(data)
                self.printSubtree()
            else:
                self.left.addNode(data)  # recursively calling addNode method
        else:
            if self.right is None:
                self.right = Node(data)
                self.printSubtree()
            else:
                self.right.addNode(data)

    def printSubtree(self):
        if not self.left is None and not self.right is None:
            print self.left.data, self.data, self.right.data
        elif self.left is None and not self.right is None:
            print None, self.data, self.right.data
        elif not self.left is None and self.right is None:
            print self.left.data, self.data, None
        else:
            print None, self.data, None

if __name__ == '__main__':
    n = Node(5)
    n.printSubtree()
    n.addNode(3)
    n.addNode(2)
    n.addNode(8)
    n.addNode(4)

答案 1 :(得分:0)

1-您在添加节点后打印,因此您无法找到具有None,Number,None的元素(因此请在添加节点之前尝试移动此部分)。 2-打印时你只考虑了三种可能性,但还有另外一种,当左边和右边的节点都是None时,尝试添加它。