Printing BFS (Binary Tree) in Level Order with Specific Formatting

前端 未结 15 1265
情歌与酒
情歌与酒 2020-12-04 13:00

To begin with, this question is not a dup of this one, but builds on it.

Taking the tree in that question as an example,

    1 
   / \\
  2   3
 /            


        
相关标签:
15条回答
  • 2020-12-04 13:14

    why not keep sentinal in queue and check when all the nodes in current level are processed.

    public void printLevel(Node n) {
        Queue<Integer> q = new ArrayBlockingQueue<Integer>();
        Node sentinal = new Node(-1);
        q.put(n);
        q.put(sentinal);
        while(q.size() > 0) {
            n = q.poll();
            System.out.println(n.value + " "); 
            if (n == sentinal && q.size() > 0) {
               q.put(sentinal); //push at the end again for next level
               System.out.println();
            }
            if (q.left != null) q.put(n.left);
            if (q.right != null) q.put(n.right);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 13:18

    A simple Version based on Bread First Search, This code is applicable for graphs in general and can be used for binary trees as well.

    def printBfsLevels(graph,start):
      queue=[start]
      path=[]
      currLevel=1
      levelMembers=1
      height=[(0,start)]
      childCount=0
      print queue
      while queue:
        visNode=queue.pop(0)
        if visNode not in path:
          if  levelMembers==0:
            levelMembers=childCount
            childCount=0
            currLevel=currLevel+1
          queue=queue+graph.get(visNode,[])
          if levelMembers > 0:
            levelMembers=levelMembers-1
            for node in graph.get(visNode,[]):
              childCount=childCount+1
              height.append((currLevel,node))
          path=path+[visNode]
    
      prevLevel=None
    
      for v,k in sorted(height):
            if prevLevel!=v:
              if prevLevel!=None:
                print "\n"
            prevLevel=v
            print k,
      return height
    
    g={1: [2, 3,6], 2: [4, 5], 3: [6, 7],4:[8,9,13]}
    printBfsLevels(g,1)
    
    
    >>> 
    [1]
    1 
    
    2 3 6 
    
    4 5 6 7 
    
    8 9 13
    >>> 
    

    Another version based on Recursion, which is specific to binary tree

    class BinTree:
      "Node in a binary tree"
      def __init__(self,val,leftChild=None,rightChild=None,root=None):
        self.val=val
        self.leftChild=leftChild
        self.rightChild=rightChild
        self.root=root
        if not leftChild and not rightChild:
          self.isExternal=True
    
      def getChildren(self,node):
        children=[]
        if node.isExternal:
          return []
        if node.leftChild:
          children.append(node.leftChild)
        if node.rightChild:
          children.append(node.rightChild)
        return children
    
      @staticmethod
      def createTree(tupleList):
        "Creates a Binary tree Object from a given Tuple List"
        Nodes={}
        root=None
        for item in treeRep:
          if not root:
            root=BinTree(item[0])
            root.isExternal=False
            Nodes[item[0]]=root
            root.root=root
            root.leftChild=BinTree(item[1],root=root)
            Nodes[item[1]]=root.leftChild
            root.rightChild=BinTree(item[2],root=root)
            Nodes[item[2]]=root.rightChild
          else:
            CurrentParent=Nodes[item[0]]
            CurrentParent.isExternal=False
            CurrentParent.leftChild=BinTree(item[1],root=root)
            Nodes[item[1]]=CurrentParent.leftChild
            CurrentParent.rightChild=BinTree(item[2],root=root)
            Nodes[item[2]]=CurrentParent.rightChild
        root.nodeDict=Nodes
        return root
    
      def printBfsLevels(self,levels=None):
        if levels==None:
          levels=[self]
        nextLevel=[]
        for node in levels:
          print node.val,
        for node in levels:
          nextLevel.extend(node.getChildren(node))
        print '\n'
        if nextLevel:
          node.printBfsLevels(nextLevel)  
    
    
    ##       1
    ##     2     3
    ##   4   5  6  7
    ##  8
    
    treeRep = [(1,2,3),(2,4,5),(3,6,7),(4,8,None)]
    tree= BinTree.createTree(treeRep)
    tree.printBfsLevels()
    
    >>> 
    1 
    
    2 3 
    
    4 5 6 7 
    
    8 None 
    
    0 讨论(0)
  • 2020-12-04 13:18
    class TNode:
      def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right
    
    class BST:
      def __init__(self, root):
        self._root = root
    
      def bfs(self):
        list = [self._root]
        while len(list) > 0:
            print [e.data for e in list]
            list = [e.left for e in list if e.left] + \
                   [e.right for e in list if e.right]
    bst = BST(TNode(1, TNode(2, TNode(4), TNode(5)), TNode(3, TNode(6), TNode(7))))
    bst.bfs()
    
    0 讨论(0)
  • 2020-12-04 13:19

    A version that doesn't require extra storage:

    std::deque<Node> bfs;
    bfs.push_back(start);
    int nodesInThisLayer = 1;
    int nodesInNextLayer = 0;
    while (!bfs.empty()) {
        Node front = bfs.front();
        bfs.pop_front();
        for (/*iterate over front's children*/) {
            ++nodesInNextLayer;
            nodes.push_back(child);
        }
        std::cout << node.value;
        if (0 == --nodesInThisLayer) {
            std::cout << std::endl;
            nodesInThisLayer = nodesInNextLayer; 
            nodesInNextLayer = 0;
        } else {
            std::cout << " ";
        }
    }
    

    P.S. sorry for the C++ code, I'm not very fluent in Python yet.

    0 讨论(0)
  • 2020-12-04 13:22

    This is mostly the same code as provided by Alex Martelli except this is modified for python 3.

    class Node(object):
      def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right
    
    def traverse(rootnode):
      thislevel = [rootnode]
      while thislevel:
        nextlevel = list()
        for n in thislevel:
          print (n.value,' ', end=''),
          if n.left: nextlevel.append(n.left)
          if n.right: nextlevel.append(n.right)
        print(" ")
        thislevel = nextlevel
    
    t = Node(1, Node(2, Node(4, Node(7))), Node(3, Node(5), Node(6)))
    
    traverse(t)
    
    0 讨论(0)
  • 2020-12-04 13:23

    My solution is similar to Alex Martelli's, but I separate traversal of the data structure from processing the data structure. I put the meat of the code into iterLayers to keep printByLayer short and sweet.

    from collections import deque
    
    class Node:
        def __init__(self, val, lc=None, rc=None):
            self.val = val
            self.lc = lc
            self.rc = rc
    
        def iterLayers(self):
            q = deque()
            q.append(self)
            def layerIterator(layerSize):
                for i in xrange(layerSize):
                    n = q.popleft()
                    if n.lc: q.append(n.lc)
                    if n.rc: q.append(n.rc)
                    yield n.val
            while (q):
                yield layerIterator(len(q))
    
        def printByLayer(self):
            for layer in self.iterLayers():
                print ' '.join([str(v) for v in layer])
    
    root = Node(1, Node(2, Node(4, Node(7))), Node(3, Node(5), Node(6)))
    root.printByLayer()
    

    which prints the following when run:

    1
    2 3
    4 5 6
    7
    
    0 讨论(0)
提交回复
热议问题