二叉搜索树 | 判断二叉树是否为AVL树 AVL Tree

判断要求

判断一个二叉树是否为AVL树

  1. 这个树是一个二叉搜索树binary search tree。
  2. 任意一个节点的两个子树高度差不大于1。

关于第一点要求,请参考二叉搜索树 | 判断二叉树是否为二叉搜索树(二分查找树)Binary Search Tree
~~public class BinaryTree 也在文章中展示

关于第二点要求:解决思路是利用一个方法 public static int getHeight(BinaryTree tree) 来求取每一个节点的左右子树的高度height,然后判断差值是否不大于以1。

public static int getHeight(BinaryTree tree){
    if(tree == null){
      return 0;
    }
    return 1 + Math.max(getHeight(tree.getLeft()), getHeight(tree.getRight()));
  }

有了这个方法,再结合判断是否为二叉搜索树的方法,就得到了判断一个二叉树是否为AVL树的方法

public static boolean isTreeAVL(BinaryTree tree) {
	if(tree == null) return true;
    
    int left = getHeight(tree.getLeft());
    int right = getHeight(tree.getRight());
    
    if(Math.abs(left-right) > 1){
      return false;
    }
    return isTreeAVL(tree.getLeft()) && isTreeAVL(tree.getRight()) && isTreeBST(tree);
  }

其中 isTreeBST(BinaryTree tree) 也在以下展示:

public static boolean isTreeBST(BinaryTree tree) {
    return Inorder(tree, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
  
public static boolean Inorder(BinaryTree tree, int Min, int Max){
   	if(tree == null) return true;
    if(tree.getKey() < Min || tree.getKey() > Max){
      return false;
    }
    return Inorder(tree.getRight(), tree.getKey()+1, Max) && Inorder(tree.getLeft(), Min, tree.getKey()-1);
  }

你可能感兴趣的:(算法与数据结构,ADS(JAVA),算法,二叉树,数据结构,java,leetcode)