22.二叉树-求树的宽度

使用队列,层次遍历二叉树。在上一层遍历完成后,下一层的所有节点已经放到队列中,此时队列中的元素个数就是下一层的宽度。以此类推,依次遍历下一层即可求出二叉树的最大宽度。

22.二叉树-求树的宽度

 

package facehandjava.tree;

import java.util.LinkedList;
import java.util.Queue;

public class WidthTree {
   
public static Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错
       
Node J = new Node(8, null, null);
        Node H =
new Node(4, null, null);
        Node G =
new Node(2, null, null);
        Node F =
new Node(7, null, J);
        Node E =
new Node(5, H, null);
        Node D =
new Node(1, null, G);
        Node C =
new Node(9, F, null);
        Node B =
new Node(3, D, E);
        Node A =
new Node(6, B, C);
       
return A;   //返回根节点
   
}

   
public static void main(String[] args) {
        Node root = WidthTree.init();
        System.
out.println("树的宽度");
       
int L = WidthTree(root);
        System.
out.println(L);
    }

   
public static int WidthTree(Node node) {
        Queue<Node> queue =
new LinkedList<>();
        queue.add(node);
       
int max = 0;
       
while (!queue.isEmpty()){
           
int size =queue.size();
            max = max > size ? max :size;
           
while (size> 0) {
                Node temp =queue.remove();
                size--;
                
if (temp.getLeftNode()!= null) {
                   queue.add(temp.getLeftNode());
                }
               
if (temp.getRightNode() != null) {
                   queue.add(temp.getRightNode());
                }
            }
        }
       
return max;
    }
}