python中的BFS来自预购和顺序

时间:2012-06-24 04:40:34

标签: python binary-tree breadth-first-search

(Python 2.7)我需要打印一个二叉树的bfs,它具有给定的预订顺序和顺序以及预订顺序和顺序的字符串的最大长度。 我知道它是如何工作的,例如: 序:ABCDE 序:CBDAE 最大长度:5

                A
             /     \
           B        E
          / \         
         C   D

BFS:ABECD

到目前为止,我已经弄明白了

class BinaryTree:
    def __init__ (self, value, parent=None):
            self.parent = parent
            self.left_child = None
            self.right_child = None
            self.value=value

    def setLeftChild(self, child=None):
            self.left_child = child
            if child:
                child.parent = self

    def setRightChild(self, child=None):
            self.right_child = child
            if child:
                child.parent = self


preorder={}
inorder={}

print "max string length?"
i=int(raw_input())
count=0
while i>count:
    print"insert the preorder"
    preorder[raw_input()]=count
    count=count+1
print "preorder is",sorted(preorder, key=preorder.get)

count2=0
while i>count2:
    print"insert the inorder"
    inorder[raw_input()]=count2
    count2=count2+1
print "inorder is",sorted(inorder, key=inorder.get)
root=

我已经想出了如何在python中创建二叉树,但问题是我不知道如何添加下一个孩子的值。正如你所看到的,我已经有了根并想出了如何插入第一个孩子(左和右),但我不知道如何添加下一个孩子。

3 个答案:

答案 0 :(得分:2)

我想基本上问题是如何从给定的前序和顺序中获取树的所有parent-leftChild对和parent-rightChild对

要获取parent-leftChild对,您需要检查:1)node1是否在node2之前是正确的; 2)如果node2在inorder

中位于node1的前面

您的示例预订:ABCDE inorder:CBDAE

  • B在预先排序的A之后,B在顺序排在A的前面,因此B是A的左边孩子。

  • D在C之后是预先排序,但D也在C之后依次排列,因此D不是C的左子女

您可以使用类似的技巧获取所有parent-rightChild对

答案 1 :(得分:1)

要将子项添加到任何节点,只需获取要添加子项的节点,并在其上调用setLeftChild或setRightChild。

答案 2 :(得分:0)

如果你正在使用BFS - 理想情况下你想使用图表 - 一个优秀的图书馆是networkx

一个例子:

import networkx as nx

g = nx.DiGraph()
g.add_edge('A', 'B')
g.add_edge('A', 'E')
g.add_edge('B', 'C')
g.add_edge('B', 'D')

print 'A' + ''.join(node[1] for node in (nx.bfs_edges(g, 'A')))

# ABECD