求一颗二叉树的最大宽度
题目:给定一个二叉树节点的定义,要求返回二叉树最大宽度。
*分析:二叉树的最大宽度也就是在二叉树上某一层节点的的个数达最大。
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
//求一颗树最大宽度的节点数
/*
* 分析:二叉树的最大宽度也就是在二叉树上某一层节点的的个数达最大。
* 1.采用HashMap 存放一组<k,v>.k表示当前节点,
* v表示当前节点的层数以便统计每一层的节点数,和跳转下一层重新统计
* 2.队列是为了层次遍历整棵树。
* 3.别忘最后一层统计,做比较
* */
public class GetTreeMaxWidth {
static class TreeNode {
public int value;
public TreeNode leftChild;
public TreeNode rightChild;
public TreeNode(int data, TreeNode lc, TreeNode rc) {
this.value = data;
this.leftChild = lc;
this.rightChild = rc;
}
}
//主函数
public static void main(String[] args) {
TreeNode node7 = new TreeNode(7,null,null);
TreeNode node8 = new TreeNode(8,null,null);
TreeNode node9 = new TreeNode(9,null,null);
TreeNode node10 = new TreeNode(10,null,null);
TreeNode node11 = new TreeNode(11,null,null);
TreeNode node12 = new TreeNode(12,null,null);
TreeNode node6 = new TreeNode(6,node11,node12);
TreeNode node5 = new TreeNode(5,node9,node10);
TreeNode node4 = new TreeNode(4,node7,node8);
TreeNode node3 = new TreeNode(3,node5,node6);
TreeNode node2 = new TreeNode(2,node4,null);
TreeNode node1 = new TreeNode(1,node2,node3);
System.out.println(getMaxWith(node1));
}
static int getMaxWith(TreeNode head) {
int max=0;//最大宽度
int curNodes = 0;//当前节点数
int curLevel = 1;//当前层数
//hashmap 就是记录此节点的当前层数
HashMap<TreeNode, Integer> levelMap = new HashMap<TreeNode, Integer>();
levelMap.put(head, curLevel);
//由于我要层次遍历这一颗树,统计每一层的节点树所以定义一个队列
Queue<TreeNode> queueNode = new LinkedList<TreeNode>();
queueNode.add(head);
while (!queueNode.isEmpty()) {
TreeNode curNode = queueNode.poll();
int curNodeLevel = levelMap.get(curNode); //当前节点所在的层数
//如果左孩子不空 要更新levelMap的值和将左孩子加入队列
if(curNode.leftChild != null) {
queueNode.add(curNode.leftChild);
levelMap.put(curNode.leftChild, curLevel+1);
}
//如果右孩子不空 要更新levelMap的值和将右孩子加入队列
if(curNode.rightChild != null) {
queueNode.add(curNode.rightChild);
levelMap.put(curNode.rightChild, curLevel+1);
}
//要判断当前层是不是等于当前节点所在的层,来更新当前节点数
if(curLevel == curNodeLevel)
curNodes++;
//如果不是则说明此时那一层节点统计完毕,要更新max和当前层节点+=1和当前节点数=1
else {
max = Math.max(max, curNodes);
curLevel++;
curNodes=1;
}
}
//最后一层别忘了对比,
max = Math.max(max, curNodes);
return max;
}