Java 判断一颗二叉树是否是平衡二叉树、二叉搜索树、完全二叉树

判断一颗二叉树是否是平衡二叉树

平衡二叉树定义

平衡二叉树:平衡二叉树也称AVL树,其任意结点左右子树的高度差小于等于1【平衡二叉树不一定是排序二叉树】;
更多相关内容可参考:平衡二叉树详解 通俗易懂

平衡二叉树

思路

根据平衡二叉树的性质:

  • 分别判断左右子树是否是平衡二叉树,如果不是,则直接返回false;
  • 分别获取左右子树的高度,计算左右子树高度差,如果绝对值大于1,则返回false;

代码实现

 private static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int value) {
            this.value = value;
        }
    }

    /**
     * 判断一棵树是否是平衡二叉树
     *
     * @param node
     * @return
     */
    private static boolean isBalanceTree(Node node) {
        //java为值传递,基础类型不改变值
        boolean[] isBalance = new boolean[1];
        isBalance[0] = true;
        getHeight(node, 1, isBalance);
        return isBalance[0];
    }


    /**
     * 获取某个Node结点的高度
     *
     * @param node      对应结点
     * @param level     层级
     * @param isBalance 是否平衡
     * @return
     */
    private static int getHeight(Node node, int level, boolean[] isBalance) {
        if (node == null) {
            return level;
        }
        //获取node结点左子树的高度
        int leftHeight = getHeight(node.left, level + 1, isBalance);
        //如果左子树不是平衡二叉树,返回false
        if (!isBalance[0]) {
            return level;
        }
        //获取node结点右子树的高度
        int rightHeight = getHeight(node.right, level + 1, isBalance);
        //如果右子树不是平衡二叉树,返回false
        if (!isBalance[0]) {
            return level;
        }
        //如果左右子树相差大于1,返回false
        if (Math.abs(leftHeight - rightHeight) > 1) {
            isBalance[0] = false;
        }
        //当前结点高度取左右子树最大的那个高度
        return Math.max(leftHeight, rightHeight);
    }

判断一棵二叉树是否是二叉搜索树(二叉排序树)

二叉搜索树定义

  1. 二叉搜索树可以为空,也可以不为空;
  2. 非空左子树的所有键值小于等于其根结点的值;
  3. 非空右子树的所有键值大于等于其根结点的值;
  4. 左右子树都是二叉搜索树;
    二叉搜索树

思路

根据二叉排序树的性质,可以知道二叉排序树中序遍历结果是升序的,因此可以通过中序遍历方式判断是否是升序来进行判断;

代码实现

    /**
     * 定义全局变量,用于记录上一个值
     */
    private static int preValue = Integer.MIN_VALUE;
	
	
  	private static boolean isBST(Node node) {
        if (node == null) {
            //空二叉树也是二叉搜索树
            return true;
        }
        //初始化设置为int最小值
        preValue = Integer.MIN_VALUE;
        //递归判断左子树是否是二叉搜索树
        boolean isLeftBST = isBST(node.left);
        if (!isLeftBST) {
            return false;
        }
        //结点值应该大于或等于上一个结点的值
        if (node.value >= preValue) {
            preValue = node.value;
        } else {
            //不是则返回false
            return false;
        }
        //再递归判断右子树是否是二叉搜索树
        return isBST(node.right);
    }

判断一颗二叉树是否是完全二叉树

完全二叉树定义

满二叉树:在一颗二叉树中,如果每个结点都存在左子树和右子树,并且所有叶节点都在同一层上,这样的树为满二叉树。

完全二叉树:相同深度的满二叉树的所有结点(不包含叶子)在该树上都有相应的节点(包含叶子)与之对应且所有左子树先存在,才会存在右子树,然后才会存在下层子树的情况,这样的树为完全二叉树 。

更多完全二叉树请参考:数据结构之完全二叉树

完全二叉树

思路

根据完全二叉树的性质,采用层序遍历方式,将结点一层层放入队列,从队列中依次取出,如果取出NULL,则跳出循环,后续再遍历队列,如果队列中存在不为NULL的结点,则说明不是完全二叉树;

代码实现

   /**
     * 使用层序遍历判断一颗二叉树是否是完全二叉树
     *
     * @return
     */
    private static boolean isCBT(Node root) {
        if (root == null) {
            //空二叉树为完全二叉树
            return true;
        }
        //创建一个队列
        Queue<Node> queue = new LinkedList<>();
        //加入头结点
        queue.add(root);
        while (!queue.isEmpty()) {
            //从队列中取出结点,如果当前结点不为null,将左右子树加入队列,否则跳出循环
            Node node = queue.poll();
            if (node != null) {
                queue.add(node.left);
                queue.add(node.right);
            } else {
                break;
            }
        }
        //再次遍历队列,如果仍存在非空结点,则非完全二叉树
        while (!queue.isEmpty()) {
            Node node = queue.poll();
            if (node != null) {
                return false;
            }
        }
        return true;
    }

图文解释

完全二叉树

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值