• 二叉搜索树:每个节点左边节点小于右边节点,左子树的最大值一定小于根节点,小于右子树的最大值;通过中序遍历,严格递增

  • 完全二叉树:层序遍历,除了最后的一层,每层都是满的

    import java.util.*;
    /*
    * public class TreeNode {
    *   int val = 0;
    *   TreeNode left = null;
    *   TreeNode right = null;
    * }
    */
    public class Solution {
      /*
       * @param root TreeNode类 the root
       * @return bool布尔型一维数组
       */
      public boolean[] judgeIt (TreeNode root) {
          // write code here
          if(root==null){
              return new boolean[]{false,false};
          }
          ArrayList<Integer> list = new ArrayList<>();
          midsearch(root,list);
          boolean flag1=true;
          for(int i=1;i<list.size();i++){
              if(list.get(i)<list.get(i-1)){
                  flag1=false;
                  break;
              }
          }
          boolean flag2=isCompleteTree(root);
          return new boolean[]{flag1,flag2};
      }
    
      public void midsearch(TreeNode root,ArrayList<Integer> list){
           // 中序遍历
          if(root==null){
              return ;
          }
          midsearch(root.left,list);
          list.add(root.val);
          midsearch(root.right,list);
      }
    
      public boolean isCompleteTree(TreeNode root){
          // 判断一棵树是否为完全二叉树,层序遍历,一旦出现null
          //则队列中剩余的节点必须为叶子节点
          Queue<TreeNode> queue=new LinkedList<TreeNode>();
          queue.add(root);
          while(!queue.isEmpty()){
              TreeNode cur=queue.poll();
              if(cur.left==null){
                  // 遍历每个节点
                  if(cur.right!=null){
                      return false;
                  }
                  while(!queue.isEmpty()){
                      TreeNode p=queue.poll();
                      if(p.left!=null || p.right!=null){
                          return false;
                      }
                  }
                  return true;
              }
              else{
                  queue.add(cur.left);
              }
              if(cur.right==null){
                  while(!queue.isEmpty()){
                      TreeNode q=queue.poll();
                      if(q.right!=null || q.left!=null){
                          return false;
                      }
                  }
                  return true;
              }
              else{
                  queue.add(cur.right);
              }
          }
          return true;
      }
    }
// 搜索二叉树:中序遍历是左中右,而搜索二叉树就是 左 < 中 < 右,
//稍加改动,将弹出的值用一个变量保存(可以初始化为系统最小值),比较大小
    public static boolean isBST (Node head) {
        if (head == null) {
            return true;
        }
        Stack<Node> stack = new Stack<Node>();
        int pre = Integer.MIN_VALUE;
            // 这里定义一个系统最小数,用于下面的和前面的数比较
        while (!stack.isEmpty() || head != null) {
            if (head != null) {
                stack.push(head);
                head = head.left;
            } else {
                head = stack.pop();
    // --------这里本来是中序遍历打印节点的地方,这里改成和前面的节点值比较,
    //如果大于,直接返回false,否则迭代------------
                if (head.value < pre) { 
    // 搜索二叉树默认节点不相等,若相等,就会变成同一个节点
                    return false;
                } else {
                    pre = head.value;
                }
    // -------------------------------------------
                head = head.right;
            }
        }
        return true;
    }
// 这里是判断二叉树是否是完全二叉树,
// 这里用到两个技巧:1、用queue来层级遍历,2、每个节点的左右节点有四种情况:左空右空,左有右空,左空右有,左有右有
// 其中如果左空右有,直接返回false,如果左空右空,左有右空,那么接下来的节点一定是叶节点
    public static boolean isCBT(Node head){
        if(head==null){
            return true;
        }
        Queue<Node> queue=new LinkedList<Node>();
        boolean leaf=false;
        Node l=null;
        Node r=null;
        queue.offer(head);// 想queue里面增加元素
        while(!queue.isEmpty()){
            head=queue.poll();
            l=head.left;
            r=head.right;
   /**
   * 判断完全二叉树的两个标准:
   *①某个节点有右孩子没有左孩子,则不是完全二叉树
   *②满足①的条件下,某个节点没有右孩子有左孩子,或者没有左右孩子时,
   * 后面遇到的所有节点必须是叶节点。
   **/
        // 右节点不为空但是左节点为空,直接返回false    
        if((leaf&&(l!=null  || r!=null)) || (l==null&&r!=null)){
            return false;
        }

        // 其他情况,往queue里面存节点
        if (l != null) {
                queue.offer(l);
            }
            if (r != null) {
                queue.offer(r);
            }
            if(l==null || r==null){
                leaf=true;
            }
        }
        return true;
    }