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

来源:互联网 发布:隔热断桥铝合金 知乎 编辑:程序博客网 时间:2024/06/16 04:03

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

这里写图片描述

解法:
思路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;     }
0 0
原创粉丝点击