美文网首页
判断树是否是AVL

判断树是否是AVL

作者: Ethan_Walker | 来源:发表于2018-12-29 20:56 被阅读9次

方法一(不推荐)


    /**
     * 判断树是否是 AVL
     * 方法一:
     * 首先判断当前节点是否平衡(计算左右子树的高度),然后前序遍历所有的节点,判断每个节点是否平衡
     * <p>
     * 缺点:计算当前节点的高度时,左右子树都全部被遍历了一遍。再判断左子节点是否平衡,计算高度,又会将左子节点的左子树右子树遍历一遍
     * 导致大量节点重复遍历
     *
     * @param root
     * @return
     */
    public boolean isAVL(TreeNode root) {

        if (root == null) return true;

        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);

        boolean flag = true;
        if (Math.abs(leftHeight - rightHeight) > 1) {
            flag = false;
        }
        return flag && isAVL(root.left) && isAVL(root.right);
    }


    /**
     * 获得以root 为根节点的树的高
     * 计算左子树的高和右子树的高
     * 再计算当前节点的高
     * 后序计算
     *
     * @param root
     * @return
     */
    public int getHeight(TreeNode root) {
        if (root == null) return 0;
        return 1 + Math.max(getHeight(root.left), getHeight(root.right));
    }


方法二(推荐)

  /**
     * 方法二:在判断根节点是否平衡时,计算左右子树高度时,遍历到每个节点时都判断当前节点是否平衡,只要有一个不平衡,就直接返回false
     * <p>
     * 只要遍历一次树
     *
     * @param root
     * @return
     */
    public boolean isBalance(TreeNode root) {

        boolean[] isBalance = new boolean[1];
        isBalance[0] = true;

        getHeight(root, isBalance);

        return isBalance[0];

    }

    /**
     * 既计算节点 root 的高度,同时也要判断节点 root 是否平衡
     *
     * @param root
     * @param isBalance
     * @return
     */
    public int getHeight(TreeNode root, boolean[] isBalance) {
        if (root == null) return 0;

        int leftHeight = getHeight(root.left, isBalance);
        if (!isBalance[0]) return -1; // 左子树不平衡,直接返回,不用计算当前节点的高度了
        int rightHeight = getHeight(root.right, isBalance);
        if (!isBalance[0]) return -1; // 右子树不平衡,直接返回,不用计算当前节点的高度了

        if (Math.abs(leftHeight - rightHeight) > 1) {
            isBalance[0] = false;
            return -1;
        }

        // 只有左右子树平衡了,才返回高度
        return 1 + Math.max(leftHeight, rightHeight);

    }

相关文章

  • 判断树是否是AVL

    方法一(不推荐) 方法二(推荐)

  • 平衡二叉树与红黑树的对比

    AVL树(平衡二叉树) AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,...

  • AVL树参考+

    AVL树:平衡的二叉查找树 AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平...

  • AVL平衡二叉搜索树(Java)

    转载自彻底搞懂AVL树 什么是AVL树 AVL树,是一种平衡(balanced)的二叉搜索树(binary sea...

  • 数据结构与算法系列(AVL树)

    AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写。AVL树属于树的一种,而且它也是一棵二叉搜索树,...

  • AVL树

    AVL树(英语:AVL Tree)Wiki 特点 AVL树是平衡树的一种 定义是左右子树的高度的差值小于等于1 A...

  • 11-AVL树

    AVL树 AVL树是最早发明的自平衡二叉搜索树之一, AVL取名于两位发明者的名字,有人把AVL树叶念做“艾薇儿树...

  • 数据结构与算法-AVL 红黑树

    AVL树AVL树 算法红黑树红黑树 B站

  • 数据结构07-AVL树

    数据结构07-AVL树 一、AVL树的基本概念 1.AVL树 AVL树是一种每一个节点的左子树与右子树的高度差最多...

  • [数据结构与算法-iOS 实现] AVL 树实现代码附 demo

    iOS AVL 树实现代码附 demo AVL 树继承自 二叉搜索树,只不过 AVL 树为平衡二叉搜索树,所以,...

网友评论

      本文标题:判断树是否是AVL

      本文链接:https://www.haomeiwen.com/subject/kfzplqtx.html