• 数据结构与算法-第12章二叉树和其他树-004求二叉树的最多结点数及对应的层数


    1.

     1 package chapter12Tree;
     2 
     3 import dataStructures.ArrayQueue;
     4 
     5 //We perform a level-order traversal. To differentiate among nodes at different levels,
     6 //we use a unique pointer which serves as an end of level marker. 
     7 //This pointer is added to the level order queue following the last node at each level. 
     8 //As nodes are removed from the queue, a counter is incremented until the end of level 
     9 //marker is removed. This strategy enables us to determine the number of nodes 
    10 //in a level. The code is given below.
    11 public class BinaryTreeMaxLevel
    12 {
    13    /** @return level with max umber of nodes */
    14    public static int maxLevel(BinaryTreeNode t)
    15    {
    16       if (t == null)
    17          // tree is empty
    18          return 0;
    19 
    20       // maxLevel is current level with max nodes
    21       // maxNodes is number of nodes on level maxLevel
    22       int maxLevel = 0;
    23       int maxNodes = 0;
    24       
    25       // create a unique pointer to use an end of level marker in queue
    26       BinaryTreeNode endOfLevel = new BinaryTreeNode();
    27    
    28       // put t and endOfLevel marker on queue q
    29       ArrayQueue q = new ArrayQueue();
    30       q.put(t);
    31       q.put(endOfLevel);
    32 
    33       // do a level order traversal
    34       int currentLevel = 1;    // level of nodes being examined
    35       int numOfNodes = 0;      // number of nodes seen of currentLevel
    36       while (true) 
    37       {
    38          BinaryTreeNode p = (BinaryTreeNode) q.remove();
    39          if (p == endOfLevel)
    40          {
    41             // see if currentLevel has more nodes than MaxLevel
    42             if (numOfNodes > maxNodes)
    43             {// found a level with more nodes
    44                maxNodes = numOfNodes;
    45                 maxLevel = currentLevel;
    46             }
    47             else
    48                if (numOfNodes == 0)
    49                   // empty level, no more nodes
    50                   return maxLevel;
    51 
    52             // set currentLevel and numOfNodes to start new level
    53             currentLevel++;
    54             numOfNodes = 0;
    55 
    56             q.put(endOfLevel);
    57          }
    58          else
    59          {// continuation of current level
    60             numOfNodes++;
    61 
    62             // put p's children on queue
    63             if (p.leftChild != null) 
    64                q.put(p.leftChild);
    65             if (p.rightChild != null)
    66                q.put(p.rightChild);
    67          }
    68       }
    69     }
    70 }

    2.

      1 /** a queue class that uses a one-dimensional array */
      2 
      3 package dataStructures;
      4 
      5 public class ArrayQueue implements Queue
      6 {
      7    // data members
      8    int front;          // one counterclockwise from first element
      9    int rear;           // position of rear element of queue
     10    Object [] queue;    // element array
     11 
     12    // constructors
     13    /** create a queue with the given initial capacity */
     14    public ArrayQueue(int initialCapacity)
     15    {
     16       if (initialCapacity < 1)
     17          throw new IllegalArgumentException
     18                ("initialCapacity must be >= 1");
     19       queue = new Object [initialCapacity + 1];
     20       // default front = rear = 0
     21    }
     22 
     23    /** create a queue with initial capacity 10 */
     24    public ArrayQueue()
     25    {// use default capacity of 10
     26       this(10);
     27    }
     28 
     29    // methods
     30    /** @return true iff queue is empty */
     31    public boolean isEmpty()
     32       {return front == rear;}
     33 
     34 
     35    /** @return front element of queue
     36      * @return null if queue is empty */
     37    public Object getFrontElement()
     38    {
     39       if (isEmpty())
     40          return null;
     41       else
     42          return queue[(front + 1) % queue.length];
     43    }
     44 
     45    /** @return rear element of queue
     46      * @return null if the queue is empty */
     47    public Object getRearElement()
     48    {
     49       if (isEmpty())
     50          return null;
     51       else
     52          return queue[rear];
     53    }
     54 
     55    /** insert theElement at the rear of the queue */
     56    public void put(Object theElement)
     57    {
     58       // increase array length if necessary
     59       if ((rear + 1) % queue.length == front)
     60       {// double array size
     61          // allocate a new array
     62          Object [] newQueue = new Object [2 * queue.length];
     63 
     64          // copy elements into new array
     65          int start = (front + 1) % queue.length;
     66          if (start < 2)
     67             // no wrap around
     68             System.arraycopy(queue, start, newQueue, 0,
     69                              queue.length - 1);
     70          else
     71          {  // queue wraps around
     72             System.arraycopy(queue, start, newQueue, 0,
     73                              queue.length - start);
     74             System.arraycopy(queue, 0, newQueue,
     75                              queue.length - start, rear + 1);
     76          }
     77 
     78          // switch to newQueue and set front and rear
     79          front = newQueue.length - 1;
     80          rear = queue.length - 2;   // queue size is queue.length - 1
     81          queue = newQueue;
     82       }
     83 
     84       // put theElement at the rear of the queue
     85       rear = (rear + 1) % queue.length;
     86       queue[rear] = theElement;
     87    }
     88 
     89    /** remove an element from the front of the queue
     90      * @return removed element
     91      * @return null if the queue is empty */
     92    public Object remove()
     93    {
     94       if (isEmpty())
     95          return null;
     96       front = (front + 1) % queue.length;
     97       Object frontElement = queue[front];
     98       queue[front] = null;   // enable garbage collection
     99       return frontElement;
    100    }
    101    
    102    /** test program */
    103    public static void main(String [] args)
    104    {  
    105       int x;
    106       ArrayQueue q = new ArrayQueue(3);
    107       // add a few elements
    108       q.put(new Integer(1));
    109       q.put(new Integer(2));
    110       q.put(new Integer(3));
    111       q.put(new Integer(4));
    112 
    113       // remove and add to test wraparound array doubling
    114       q.remove();
    115       q.remove();
    116       q.put(new Integer(5));
    117       q.put(new Integer(6));
    118       q.put(new Integer(7));
    119       q.put(new Integer(8));
    120       q.put(new Integer(9));
    121       q.put(new Integer(10));
    122       q.put(new Integer(11));
    123       q.put(new Integer(12));
    124 
    125       // delete all elements
    126       while (!q.isEmpty())
    127       {
    128          System.out.println("Rear element is " + q.getRearElement());
    129          System.out.println("Front element is " + q.getFrontElement());
    130          System.out.println("Removed the element " + q.remove());
    131       }
    132    }  
    133 }
  • 相关阅读:
    docker
    20192413宗俊豪汇编语言程序设计学习总结
    20192413宗俊豪 202120222 《网络与系统攻防技术》实验一实验报告
    测试部门目标
    Ubuntu安装/配置Nvim+coc.vim
    nginx反向代理nexus私服
    数据库级别判断数据重复
    使用注解管理spring bean生命周期
    合并两个有序链表
    如何查找对应的JVM参数
  • 原文地址:https://www.cnblogs.com/shamgod/p/5295673.html
Copyright © 2020-2023  润新知