检查AVLTree是否是一棵BST
- 中序遍历AVLTree,如果满足BST的定义,其结果是从小到大的;
// 判断该二叉树是否是一棵二分搜索树
public boolean isBST(){
ArrayList<K> keys = new ArrayList<>();
inOrder(root, keys);
for(int i = 1 ; i < keys.size() ; i ++)
if(keys.get(i - 1).compareTo(keys.get(i)) > 0)
return false;
return true;
}
private void inOrder(Node node, ArrayList<K> keys){
if(node == null)
return;
inOrder(node.left, keys);
keys.add(node.key);
inOrder(node.right, keys);
}
判断AVL树是否是一棵平衡二叉树
- 将问题转化为一个递归问题:判断以node为根的AVL树是否已是平衡二叉树;
- 不能再缩小的基本问题是:对node情况的判断;
- 如果node == null,那么以node为根的AVL树是平衡的;
- 如果node的平衡因子的绝对值大于1,那么以node为根的AVL树是不平衡的;
- 规模更小的同一个问题是:node的左孩子为根的AVL树是否已是平衡二叉树,node的右孩子为根的AVL树是否已是平衡二叉树;只有当以node的左右孩子为根的AVL树都是平衡二叉树时,以node为根的AVL树才是平衡二叉树;
// 判断该二叉树是否是一棵平衡二叉树
public boolean isBalanced(){
return isBalanced(root);
}
// 判断以Node为根的二叉树是否是一棵平衡二叉树,递归算法
private boolean isBalanced(Node node){
if(node == null)
return true;
int balanceFactor = getBalanceFactor(node);
if(Math.abs(balanceFactor) > 1)
return false;
return isBalanced(node.left) && isBalanced(node.right);
}