判读一棵树是不是平衡二叉树

要求

给定一棵二叉树,判断是否为平衡二叉树

思路

总体思路是这样的

先分别判断左右子树是不是平衡的,若左右子树都是平衡二叉树,则判断左右子树的高度差是不是满足绝对值小于等于 1 的条件

伪代码

is_balanced_tree = true;

void is_balance(root)
{
    get_height(root)
    return is_balanced_tree;
}

get_height(TreeNode root)
{
    // 计算左子树的高度
    lh = get_height(root.left);

    // 计算右子树高度
    rh = get_height(root.right);

    //判断是否是平衡树
    if(abs(lh-rh)>1){
        is_balanced_tree = false;
    }
    return max(lh,rh);
}

具体代码如下:

public class BinaryTreeTest {
    public static void main(String[] args) {
        // 构造一棵树
        TreeNode root = generateTree();

        // 判断是不是平衡树
        boolean isBalance = isBalance(root,0);
        System.out.println(isBalance);



    }

    private static boolean isBalance(TreeNode root,int level) {

        // 总体思路还是按照二叉树后序遍历的方式,先判断左子树,再判断右子树
        // 判断左子树的过程中,要找到 两个 有效信息
        // 第一:左子树的深度; 第二:左子树是否是平衡树
        // 若左子树不是平衡树,则可以判断整棵树不是平衡树,直接返回 false
        // 若左子树是平衡术,则根据返回左子树的深度,返回左子树的深度是为了
        // 当递归最后返回的时候,利用跟节点的左右子树的深度,判断整棵树是不是平衡树
        // 右子树的遍历也是同样的道理

        // 这里定义为一个元素个数的数组,是为了在递归调用时,其中某次递归调用改变了这个值,
        // 对其他所有的过程可见,相当于一个全局变量
        boolean[] res = new boolean[1];
        res[0] = true;

        // level 纪录的是,不满足平衡树的节点所在的树中的层次。
        level = getHight(root,1, res);
        System.out.println(level);
        return res[0];

    }

    private static int getHight(TreeNode root,int level, boolean[] res) {

        if (root == null) {
            return 0;
        }



        int lHeight = getHight(root.left, level+1,res);

        // 如果发现左子树已经不是平衡二叉树,则直接返回
        // 其实这个 if 语句的判断对整体程序对理解有一点对障碍,完全可以没有,
        // 这个判断对作用就在于,当法相某个左子树已经不是平衡树当时候,可以直接返回了,程序不用在继续递归调用
        // 其实完全可以没有,这样只是减少了算法计算量,但是对于整个程序的理解造成一定的困难,至少对我来说是这样。
        if (!res[0]) {
            return level;
        }

        int rHeight = getHight(root.right,level+1, res);
        if (!res[0]) {
            return rHeight;
        }


        if (Math.abs(lHeight - rHeight) > 1) {
            res[0] = false;
//            return level;
        }
        return Math.max(lHeight,rHeight)+1;
    }

    private static TreeNode<Integer> generateTree() {
        TreeNode<Integer> root = new TreeNode<>(1);
        TreeNode<Integer> second = new TreeNode<>(2);
        TreeNode<Integer> third = new TreeNode<>(3);
        TreeNode<Integer> forth = new TreeNode<>(4);
        TreeNode<Integer> fifth = new TreeNode<>(5);

        root.left = second;
        root.right = third;

        second.left = forth;
        forth.left = fifth;

        return root;
    }
}
public class TreeNode<T> {
    T data;
    TreeNode left;
    TreeNode right;

    public TreeNode(T data, TreeNode left, TreeNode right) {
        this.data = data;
        this.left = left;
        this.right = right;
    }

    public TreeNode(T data) {
        this.data = data;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值