层序遍历的应用
1.计算二叉树的高度:递归和迭代
- 递归方法:每个节点的高度等于1加上左右子树高度最高的那个
public int height2() {
return height(root);
}
private int height(Node<E> node) {
if (node == null) return 0;
return 1 + Math.max(height(node.left), height(node.right));
}
- 迭代方法:利用层序遍历
- 当while执行完一遍,则该层节点全都访问完,并且全都出队,所以队列里剩的就是下一层节点个数,所以也就是说height++
public int height() {
if (root == null) return 0;
int height = 0;
int levelSize = 1;
Queue<Node<E>> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node<E> node = queue.poll();
levelSize--;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
if (levelSize == 0) {
levelSize = queue.size();
height++;
}
}
return height;
}
2.判断一棵树是否为完全二叉树
- 按照层序遍历思路可以遍历到所有节点,只需在其添加一些内容即可
- 当 node.left != null 节点入队,否则左子树为空说明肯定不是完全二叉树(如上图一个正确的完全二叉树可以知道)
- 当 node.right != null 节点入队,否则右子树为空,如果是完全二叉树且右子树为空,则该节点之后全是叶子节点(如上图一个正确的完全二叉树可以知道),所以让标识量leaf == true
- 在开头判断即将考虑的节点是否真正为叶子节点,即标识量leaf == true但是它有孩子节点,则直接说明不是完全二叉树
public boolean isComplete(){
if (root == null) return false;
Queue<Node<E>> queue = new LinkedList<>();
queue.offer(root);
boolean leaf = false;
while(!queue.isEmpty()){
Node<E> node = queue.poll();
if (leaf && !node.isLeaf())
return false;
if(node.left != null){
queue.offer(node.left);
} else if (node.right != null){
return false;
}
if (node.right != null) {
queue.offer(node.right);
} else {
leaf = true;
}
}
return true;
}
总结:以后如果用到层序遍历去完成一些操作时候,建议先把层序遍历写好,也就意味着先保证每个节点都可以遍历到,在此基础上再加一些逻辑