LeetCode.M662
题目:
题目大意:
求二叉树的最大宽度,因为题目中要求将这个二叉树看做满二叉树,所以不是简单的求每层的节点个数。
数据范围:
如图所示
思路:
将该二叉树看做满二叉树,记录每个节点在所对应的满二叉树的位置,则每一层的宽度为用该层最后一个节点位置减去该层第一个节点位置+1。用TreeNode.val来记录每个节点的位置。
我们使用nowlen来代表该层有几个节点,每遍历一个节点,nowlen – ,当nowlen为0时,该层遍历结束。相应的nextlen代表下一层有几个节点,每入队一个节点,nextlen ++ 。该层遍历结束时,nowlen = nextlen,nextlen = 0。
代码:
import java.util.ArrayDeque;
import java.util.Queue;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
public int widthOfBinaryTree(TreeNode root) {
int ans = 0, nowlen = 1, nextlen = 0;
Queue<TreeNode> queue = new ArrayDeque<>();
root.val = 1;
queue.add(root);
while (!queue.isEmpty()){
int firstNodeIdx = 0;
boolean isFirst = true;
while (nowlen -- > 0){
TreeNode node = queue.poll();
if (isFirst){
firstNodeIdx = node.val;
isFirst = false;
}
ans = Math.max(ans, node.val - firstNodeIdx + 1);
if (node.left != null){
node.left.val = node.val * 2;
queue.add(node.left);
nextlen ++ ;
}
if (node.right != null){
node.right.val = node.val * 2 + 1;
queue.add(node.right);
nextlen ++ ;
}
}
nowlen = nextlen;
nextlen = 0;
}
return ans;
}
}
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
node3.right = node6;
System.out.println(solution.widthOfBinaryTree(node1));
}
}
时空复杂度分析等:
-
时间复杂度 : O(n)
-
空间复杂度 : O(n)