所谓二叉树的宽度,就是相当于二叉树在分层遍历的时候,每一层都有自己的节点数,然后找出层数最大的那个。
其实这里只需要借助于分层遍历即可,需要注意的是,我们需要知道什么时候开始一个新的层即可,常见的思路有两种,一种是保存每一层最左边的节点,一种是保存每一层的节点个数。
如果是保存每一层的最左边的节点的话,我们只需要在一个循环里面判断即可。
如果是保存每一层的节点个数的话,我们需要两个循环,即外循环是每层一个循环,内循环是每层的节点会进行循环。
我们这里仅给出第一种方式的代码实现,如下所示:
package com.mengzhidu.teach.algorithm.tree.demo.basic;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;
import java.util.ArrayDeque;
import java.util.Queue;
/**
* 求二叉树的每层的最大宽度,这里注意是每一层,而不是求直径
* 这里需要借助二叉树的分层遍历的实现,逐次比较每层的数据即可
* 这里比分层遍历稍微复杂一点,它需要确保每一层被访问完之后才能继续
* 那么如何来标记每层被访问完了呢?常见的有两种方式
* 第一种是记录下一层最左边的元素,把它保存在临时变量中
* 第二种是用一个变量记录每层有多少个,然后在操作每一层的时候把这一层的元素弹空
*/
public class WidthDemo {
public static void main(String[] args) {
TreeNode root = TreeNodeHelper.getTreeNode();
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
TreeNode left = root.getLeft();
int maxWidth = 1;
int width = 0;
while (!queue.isEmpty()) {
TreeNode tmp = queue.poll();
if (tmp == left) {
maxWidth = width > maxWidth ? width : maxWidth;
width = 1;
left = null;
}
if (tmp.getLeft() != null) {
queue.add(tmp.getLeft());
width ++;
if (left == null) {
left = tmp.getLeft();
}
}
if (tmp.getRight() != null) {
queue.add(tmp.getRight());
width ++;
if (left == null) {
left = tmp.getRight();
}
}
}
System.out.println("最大宽度为:" + maxWidth);
}
}
对于求二叉树的宽度,我们就介绍到这里啦。