笔试面试算法经典--判断二叉树是否是平衡二叉树(Java)

平衡二叉树(Balanced Binary Tree)又被称为AVL树,且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。如下面的三棵树:只有中间才是平衡二叉树。

《笔试面试算法经典--判断二叉树是否是平衡二叉树(Java)》

解法:
思路1:从根节点开始,求出根的左右子树的高度,如果根的左右子树的高度差大于1,返回FALSE,否则递归的判断根的左子树和右子树是否满足条件。

class TreeNode{
    int val;
    TreeNode left=null; 
    TreeNode right=null;
    public TreeNode(int val) {
        this.val = val;
    }
}

public boolean IsBalanced_Solution(TreeNode root) {         
         if(root==null)
             return true;
//如果树为 null 返回 TRUE。否则判断根的左右子树的高度差的绝对值是否大于1,若大于1 则返回false。
// 否则判断树的左右孩子是否是平衡二叉树,当两者都是平衡二叉树时返回TRUE,否则返回false.
         else if(Math.abs(TreeDepth(root.left)-TreeDepth(root.right))>1)
             return false;
         else return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right);

        }
        //求树的深度。
     public int TreeDepth(TreeNode root)
     {
         if(root==null)
             return 0;
             //如果树为 null 返回0 否则返回左右孩子的最大值+1。
         return Math.max(TreeDepth(root.left), TreeDepth(root.right))+1;

     }

思路2:上面的方法中,重复的计算子树的高度。可以用后序遍历,从下到上遍历如果子树中任一不满足条件返回 false,否则返回 true 这样每个节点的高度只会算一次。

public class IsBalancedTree {
    boolean isBalance=true;
    public boolean IsBalanced_Solution(TreeNode root) {         
         TreeDepth1(root);
         return isBalance;
        //isBalance 会在 TreeDepth1(root)中赋值。
        }
    public int TreeDepth1(TreeNode root)
     {
         if(root==null)
             return 0;
         int left=TreeDepth1(root.left);
         //左子树高度
         int right=TreeDepth1(root.right);
         //右子树高度
         if(Math.abs(left-right)>1)
         {
             isBalance=false;
             //只要有一个子树的左右子树的高度绝对值大于 1 isBalance=false
         }
         return Math.max(left, right)+1;
     }
    原文作者:HankingHu
    原文地址: https://blog.csdn.net/u013309870/article/details/70136114
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞