二叉树的判断

209 阅读2分钟

前言

“这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

  1. NC16 判断二叉树是否对称(简单)
  2. NC60 判断一棵二叉树是否为搜索二叉树和完全二叉树(中等)

判断二叉树是否对称

描述:给定一棵二叉树,判断其是否是自身的镜像(即:是否对称) 思路分析: DFS 定义递归函数 isEq 判断两颗树是否对称

  1. 如果都为 null 返回true
  2. 其次判断是否有一颗树是空的, 如果是 返回 false
  3. 比较两颗树根节点的值是否相等
  4. 递归比较 左树的左子树 跟 右树的右子树 && 左树的右子树 跟 右树的左子树

AC 代码:

    public boolean isSymmetric (TreeNode root) {
        // write code here
        if(root == null){
            return true;
        }
       return isEq(root.left, root.right);
    }
    
    boolean isEq(TreeNode l, TreeNode r){
        if(l == null && r == null) return true;
        if(l == null || r == null) return false;
        if(l.val != r.val) return false;
        
        return  isEq(l.left,r.right) && isEq(l.right,r.left);
    }

判断一棵二叉树是否为搜索二叉树和完全二叉树(

描述:给定一棵二叉树,已知其中的节点没有重复值,请判断该二叉树是否为搜索二叉树和完全二叉树。

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树

完全二叉树:一棵深度为k的有n个结点的,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

思路分析: 判断二叉搜索树:

  • 中序遍历 将val 保存到 list 集合中 ,判断是否升序排列
  • DFS 实现

判断完全二叉树: 按照定义, 给每个节点编号,最后判断 最后一个节点的编号是否为节点的数量

AC 代码:

    public boolean[] judgeIt (TreeNode root) {
        // write code here
        
        boolean isBfs = isBFS(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
        boolean isFull = isFull(root);
        return new boolean[]{isBfs, isFull};
    }
    
    boolean isBFS(TreeNode root, int minVal, int maxVal){
        if(root == null){
            return true;
        }
        
        if(root.val <= minVal || root.val >= maxVal){
            return false;
        }
        
        return isBFS(root.left, minVal, root.val) &&
            isBFS(root.right, root.val, maxVal);
    }
    
    boolean isFull(TreeNode root){
        List<Node> list = new ArrayList<>();
        list.add(new Node(root, 1));
        int i = 0;
        
        while(i < list.size()){
            Node cur = list.get(i);
            if(cur.node != null){
                list.add(new Node(cur.node.left, cur.no * 2));
                list.add(new Node(cur.node.right, cur.no * 2 + 1));
            }
            i++;
        }
        
        int size = list.size();
        Node last = list.get(size - 1);
        return last.no == size;
    }
    
    class Node{
        TreeNode node;
        int no;
        
        public Node(TreeNode node, int no){
            this.node = node;
            this.no = no;
        }
    }