给一棵二叉树的头节点,判断是不是平衡二叉树(两种方法)

//提供两种方法来判断一棵二叉树是否平衡。
//第一种方法是通过递归的方式遍历整棵树,同时记录每个节点的高度差。如果发现某个节点的左右子树高度差大于1,则将结果标记为不平衡。最后返回的结果是一个布尔值,表示整棵树是否平衡。
//第二种方法是通过后序遍历的方式,从底部向上计算每个节点的高度,并在计算过程中检查子树是否平衡。这种方法不需要额外的空间来存储每个节点的高度,因此在某些情况下可能更高效。同样地,最后返回的结果是一个布尔值,表示整棵树是否平衡。
public static class Node{
    public int value;
    public Node left;
    public Node right;

    public Node(int data){
        this.value = data;
    }
}
//法1
public static boolean isBalanced1(Node head){
    boolean[] ans = new boolean[1];
    ans[0] = true;
    process1(head , ans);
    return ans[0];
}

public static int process1(Node head , boolean[] ans){
    if(!ans[0] || head ==null){
        return -1;
    }
    int leftHeight = process1(head.left , ans);
    int rightHeight = process1(head.right , ans);
    if (Math.abs(leftHeight - rightHeight) > 1){
        ans[0] = false;
    }
    return Math.max(leftHeight , rightHeight) +1 ;
}


//法2
public static boolean isBalanced2(Node head){
    return process2(head).isBalaced;
}

//信息返回的结构体
public static class Info{
    //是否平衡
    public boolean isBalaced;
    //高度为多少
    public int height;
    public Info(Boolean b , int h){
        isBalaced = b;
        height = h;
    }
}

public static Info process2(Node head){
    if(head == null){
        return new Info(true , 0);
    }

    //收集左树和右树的信息
    Info leftInfo = process2(head.left);
    Info rightInfo = process2(head.right);


    //计算整棵树的高度
    int height = Math.max(leftInfo.height , rightInfo.height) +1;

    boolean isBalanced = true;
    //限制平衡二叉树的条件
    if(!leftInfo.isBalaced || !rightInfo.isBalaced || Math.abs(leftInfo.height - rightInfo.height)>1){
        isBalanced = false;
    }
    //返回整合后的信息
    return new Info(isBalanced , height);
}
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值