题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的完全二叉树。
有效 完全二叉树定义如下:
n 个结点的二叉树,对树中的结点按从上至下从左到右的顺序进行编号,如果编号为 i(1≤i≤n)的结点与满二叉树中编号为 i 的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树

解题思路:层次遍历

判断一棵树是否为「完全二叉树」,对其进行层次遍历,若遇到一个空结点则其后面的结点必须全为空结点,否则不是完全二叉树。

复杂度分析

时间复杂度:判断二叉树是否是完全二叉树 - 图1判断二叉树是否是完全二叉树 - 图2 为二叉树的节点个数。

  1. - 二叉树的每个节点最多被访问一次,因此时间复杂度为 ![](https://cdn.nlark.com/yuque/__latex/7ba55e7c64a9405a0b39a1107e90ca94.svg#card=math&code=O%28n%29&height=23&id=X3zRr)

空间复杂度:判断二叉树是否是完全二叉树 - 图3判断二叉树是否是完全二叉树 - 图4 为二叉树的节点个数。

  - 具有  ![](https://cdn.nlark.com/yuque/__latex/7b8b965ad4bca0e41ab51de7b31363a1.svg#card=math&code=n%20&height=23&id=MwfCe) 个结点的完全二叉树的最大深度为  ![](https://cdn.nlark.com/yuque/__latex/ad5f1913740b825fa1cdcacaf683a751.svg#card=math&code=%5Clfloor%20log_2n%20%5Crfloor%20%2B1&id=YKzQR),深度为   ![](https://cdn.nlark.com/yuque/__latex/ad5f1913740b825fa1cdcacaf683a751.svg#card=math&code=%5Clfloor%20log_2n%20%5Crfloor%20%2B1&id=xFBlN) 的完全二叉树至多有 ![](https://cdn.nlark.com/yuque/__latex/9b094748cef71a6ac1013c75270ee960.svg#card=math&code=2%5E%7B%5Clfloor%20log_2n%20%5Crfloor%20%2B1%7D-1%20%3D2n-1&id=p0hmY) 个结点 
  - 队列最多存储 ![](https://cdn.nlark.com/yuque/__latex/ea02f5f09fa635e33c4857ec99404ad9.svg#card=math&code=2n-1&height=23&id=tURpv) 个节点,因此需要额外的 ![](https://cdn.nlark.com/yuque/__latex/7ba55e7c64a9405a0b39a1107e90ca94.svg#card=math&code=O%28n%29&height=23&id=ncJyW) 的空间。

我的代码

public boolean isAllTreeBST(TreeNode root){
    if(root==null)return true;
    LinkedList<TreeNode> q=new LinkedList<>();
    q.addLast(root);
    //当左右子树中出现一个空缺,说明后面不能再有结点
    while(q.peek()!=null){
        TreeNode node=q.poll();
        q.addLast(node.left);
        q.addLast(node.right);
    }
    //注意有可能队列里一堆 null 结点,需要判断是否全是空结点
    while (!q.isEmpty()&&q.peek()==null)
        q.poll();
    return q.isEmpty();
}