JZ79 判断是不是平衡二叉树

描述

输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。

在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树

平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

样例解释:

JZ79 判断是不是平衡二叉树

样例二叉树如图,为一颗平衡二叉树

注:我们约定空树是平衡二叉树。

思路

先一个节点一个节点的判断其是否满足平衡二叉树。如果满足就接着判断其左右孩子是否也是平衡二叉树。

注:在计算左右孩子的深度时,用链表存储从根节点到每个叶子节点的深度,最后取出最大的值,就是该节点的深度。

代码

得到节点的深度

//得到一个节点的深度集合ArrayList
    public void sum(TreeNode root,int count,ArrayList res){
        count++;
        if(root.left != null){
           sum(root.left,count,res);
        }
        if(root.right != null){
          sum(root.right,count,res);
        }
        res.add(count);
        return;
        
    }

判断是不是平衡二叉树

  //判断以该节点root为根节点的二叉树,是否为平衡二叉树
    public boolean isBa(TreeNode root){
        ArrayList<Integer> resLift = new ArrayList<>();
        ArrayList<Integer> resRight = new ArrayList<>();
        int countLift = 0;
        int countRight = 0;
        if(root.left == null){
            countLift = 0;
        }else{
            sum(root.left,countLift,resLift);
            Collections.sort(resLift);
           countLift = resLift.get(resLift.size()-1);
        }
        if(root.right == null){
            countRight = 0;
        }else{
            sum(root.right,countRight,resRight);
            Collections.sort(resRight);
            countRight = resRight.get(resRight.size() -1);
        }
        return countLift - countRight <= 1 && countLift - countRight>=-1;
    }

 整体代码

import java.util.*;
public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        
        if(root ==null){
            return true;
        }
        //先判断根节点是否为平衡二叉树,是接接着遍历左右孩子节点
        if(!isBa(root)){
            return false;
        }else{
            return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
        }
    }
    
    //判断以该节点root为根节点的二叉树,是否为平衡二叉树
    public boolean isBa(TreeNode root){
        ArrayList<Integer> resLift = new ArrayList<>();
        ArrayList<Integer> resRight = new ArrayList<>();
        int countLift = 0;
        int countRight = 0;
        if(root.left == null){
            countLift = 0;
        }else{
            sum(root.left,countLift,resLift);
            Collections.sort(resLift);
           countLift = resLift.get(resLift.size()-1);
        }
        if(root.right == null){
            countRight = 0;
        }else{
            sum(root.right,countRight,resRight);
            Collections.sort(resRight);
            countRight = resRight.get(resRight.size() -1);
        }
        return countLift - countRight <= 1 && countLift - countRight>=-1;
    }
    
    //得到一个节点的深度集合ArrayList
    public void sum(TreeNode root,int count,ArrayList res){
        count++;
        if(root.left != null){
           sum(root.left,count,res);
        }
        if(root.right != null){
          sum(root.right,count,res);
        }
        res.add(count);
        return;
        
    }
}

上一篇:wget & curl 命令


下一篇:java语法糖