先获取树的最大深度,然后按照深度把原树改为一棵完全二叉树,添加上去的节点是一个特殊值的标记节点,然后再进行层序遍历获取每一层的节点值,再对每一层的节点进行获取,把最左边和最右边的是特殊值的树节点去掉,最终得到的就是该层的实际宽度,然后遍历得到最大宽度即可。 import java.util.*;
/*
- public class TreeNode {
- int val = 0;
- TreeNode left = null;
- TreeNode right = null;
- public TreeNode(int val) {
-
this.val = val;
- }
- } */
public class Solution {
int temp = Integer.MAX_VALUE;//特殊值
int depth =0; //树的最大深度
public int widthOfBinaryTree (TreeNode root) {
// write code here
int maxWide=0;
//获取树的最大深度
depth = maxDepth(root);
//把树填成一个完全二叉树
fillTree(root,1);
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//层序遍历获取最大宽度,在这个过程中不要去计算最左边或最右边的特殊值的节点
levelOfIteratorTree(root,res,0);
for (ArrayList<Integer> list : res) {
int length = list.size();
for (Integer integer : list) {
if (integer == Integer.MAX_VALUE) {
length--;
} else {
break;
}
}
for (int size = list.size()-1; size >= 0; size--) {
if(list.get(size)==Integer.MAX_VALUE){
length--;
} else {
break;
}
}
maxWide=Math.max(maxWide,length);
}
return maxWide;
}
private void levelOfIteratorTree(TreeNode root, ArrayList<ArrayList<Integer>> res, int level) {
if(level==res.size()){
res.add(new ArrayList<>());
}
res.get(level).add(root.val);
if(root.left!=null){
levelOfIteratorTree(root.left,res,level+1);
}
if(root.right!=null){
levelOfIteratorTree(root.right,res,level+1);
}
}
private void fillTree(TreeNode root,int curDepth) {
if(root==null){
return;
}
if(root.right == null&&root.left == null&&curDepth<=depth){
root.right=new TreeNode(temp);
root.left=new TreeNode(temp);
} else
if(root.left == null&&curDepth<=depth){
root.left=new TreeNode(temp);
} else
if(root.right == null&&curDepth<=depth){
root.right=new TreeNode(temp);
}
fillTree(root.left,curDepth+1);
fillTree(root.right,curDepth+1);
}
public int maxDepth (TreeNode root) {
if(root == null){
return 0;
}
int max = 0;
if(root.left!=null){
max = Math.max(max,maxDepth(root.left));
}
if(root.right!=null){
max = Math.max(max,maxDepth(root.right));
}
return max+1;
}
}