python - 嵌套列表中的Level-Order Traversal输出

时间:2014-11-17 18:02:42

标签: python python-3.x binary-tree traversal

用于实现二叉树的级别顺序遍历的队列类

class QNode:
  def __init__ (self, x, p=None):
    self.data = x
    self.next = p
class Queue:
  def __init__ (self):
    self.front = None
    self.back = None

  def isEmpty(self):
    return self.front == None

  def enqueue (self, x):
    p = QNode (x)
    if self.isEmpty( ):
        self.front = p
    else:
        self.back.next = p
    self.back = p

  def dequeue (self):
    if self.isEmpty( ):
        raise KeyError ("Queue is empty.")
    x = self.front.data
    self.front = self.front.next
    if self.front == None:
        self.back == None
    return x

实际的二进制树节点类

class BSTNode:
  def __init__ (self, x, L=None, R=None):
    self.data = x
    self.left = L
    self.right = R

我想做多维的水平顺序遍历

  def levelOrder(self):
    ret = []
    Q = Queue()
    if self!=None:
        Q.enqueue(self)
    while not Q.isEmpty():
        p = Q.dequeue()
        ret.append(p.data)
        if p.left!=None:
            Q.enqueue(p.left)
        if p.right!=None:
            Q.enqueue(p.right)
    return ret

在BSTNode类中,我尝试对二叉树进行级别顺序遍历。但是,它返回一个平面列表。如何使用多维数组输出实现级别顺序遍历?

1 个答案:

答案 0 :(得分:1)

我能够弄清楚这一点。你基本上需要排队一个分隔符。由于显而易见的原因,我把它作为“[”。当我第一次将第一个节点排队时,我排队了一个“[”。然后当你去出队时,如果它是一个你要出列的分隔符,那么在添加子项之前添加另一个,并且还附加一个列表,其中包含自上一个分隔符以来出列的所有值的列表。这将创建您的级别订单遍历的多维列表。解决方案如下所示

def levelOrder(self):
    order = []
    suborder = []
    Q = Queue()
    if self!=None:
        Q.enqueue(BSTNode('['))
        Q.enqueue(self)
    while not Q.isEmpty():
        p = Q.dequeue()
        if p.data is not '[' and p.data is not ']':
            suborder.append(p.data)
        if p.data == '[' and Q.front != None:
            Q.enqueue(BSTNode(']'))
            Q.enqueue(BSTNode('['))
        if p.data == ']':
            order.append(suborder)
            suborder = []
        if p.left!=None:
            Q.enqueue(p.left)
        if p.right!=None:
            Q.enqueue(p.right)
    return order