How to construct a binary tree using a level order traversal sequence

前端 未结 3 1044
死守一世寂寞
死守一世寂寞 2020-12-31 23:56

How to construct a binary tree using a level order traversal sequence, for example from sequence {1,2,3,#,#,4,#,#,5}, we can construct a binary tree like this:



        
3条回答
  •  庸人自扰
    2021-01-01 00:31

    Assume using array int[]data with 0-based index, we have a simple function to get children:

    • Left child

      int getLeftChild(int index){
         if(index*2 + 1 >= data.length)
            return -1;// -1 Means out of bound
         return data[(index*2) + 1];
      }
      
    • Right child

      int getRightChild(int index){
         if(index*2 + 2 >= data.length)
            return -1;// -1 Means out of bound           
         return data[(index*2) + 2];
      }
      

    Edit: Ok, so by maintaining a queue, we can build this binary tree.

    We use a queue to maintain those nodes that are not yet processed.

    Using a variable count to keep track of the number of children added for the current node.

    First, create a root node, assign it as the current node. So starting from index 1 (index 0 is the root), as the count is 0, we add this node as left child of the current node. Increase count. If this node is not '#', add it to the queue.

    Moving to the next index, the count is 1, so we add this as right child of current node, reset count to 0 and update current node (by assigning the current node as the first element in the queue). If this node is not '#', add it to the queue.

         int count = 0;
         Queue q = new Queue();
         q.add(new Node(data[0]);
         Node cur = null;
         for(int i = 1; i < data.length; i++){
            Node node = new Node(data[i]);
            if(count == 0){
               cur = q.dequeue();           
            }
            if(count==0){
              count++;
              cur.leftChild = node;
            }else {
              count = 0;
              cur.rightChild = node;
            }
            if(data[i] != '#'){
              q.enqueue(node);
            }
         }    
    
    
    
        class Node{
           int data;
           Node leftChild, rightChild;
        } 
    

提交回复
热议问题