github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/datastructures/tree/avl/utils.go (about)

     1  package avl
     2  
     3  func min(a, b int) int {
     4  	if a > b {
     5  		return b
     6  	} else {
     7  		return a
     8  	}
     9  }
    10  
    11  func max(a, b int) int {
    12  	if a > b {
    13  		return a
    14  	} else {
    15  		return b
    16  	}
    17  }
    18  
    19  func abs(a int) int {
    20  	if a < 0 {
    21  		return -a
    22  	}
    23  	return a
    24  }
    25  
    26  // 判断该二叉树是否是一棵二分搜索树
    27  func IsBST(tree *AVLTree) bool {
    28  	if tree == nil {
    29  		return false
    30  	}
    31  	var ls []interface{}
    32  	tree.InOrder(func(i interface{}) {
    33  		ls = append(ls, i)
    34  	})
    35  	for i := 1; i < len(ls); i++ {
    36  		cmp := tree.compareFunc(ls[i-1], ls[i])
    37  		if cmp > 0 {
    38  			return false
    39  		}
    40  	}
    41  	return true
    42  }
    43  
    44  // 判断该二叉树是否是一棵平衡二叉树
    45  func IsBalanced(tree *AVLTree) bool {
    46  	if tree == nil {
    47  		return false
    48  	}
    49  	return isBalanced(tree.root)
    50  }
    51  
    52  //判断以Node为根的二叉树是否是一棵平衡二叉树,递归算法
    53  func isBalanced(n *avlNode) bool {
    54  	if n == nil {
    55  		return true
    56  	}
    57  	balanceFactor := getBalanceFactor(n)
    58  	if abs(balanceFactor) > 1 {
    59  		return false
    60  	}
    61  	// 左子树右子树都是平衡二叉树才是
    62  	return isBalanced(n.left) && isBalanced(n.right)
    63  }