📅  最后修改于: 2023-12-03 15:12:05.490000             🧑  作者: Mango
平衡二叉树是指一棵空树或者其左右两棵子树的高度差不超过 1,并且左右两棵子树都是平衡二叉树。因此,平衡二叉树的高度相对于其他二叉树来说更加平衡,其查找、插入、删除操作的时间复杂度都能保证在 O(logn) 的级别。
为了实现高度为 h 的平衡二叉树,我们需要不断地向平衡二叉树中插入新的节点,直到树的高度达到 h 为止。为了保证平衡,我们需要在插入新节点后及时调整树的结构,重新平衡整个平衡二叉树。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public TreeNode insert(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
}
if (val < root.val) {
root.left = insert(root.left, val);
} else {
root.right = insert(root.right, val);
}
int balanceFactor = getBalanceFactor(root);
if (balanceFactor > 1 && val < root.left.val) {
return rightRotate(root);
}
if (balanceFactor < -1 && val > root.right.val) {
return leftRotate(root);
}
if (balanceFactor > 1 && val > root.left.val) {
root.left = leftRotate(root.left);
return rightRotate(root);
}
if (balanceFactor < -1 && val < root.right.val) {
root.right = rightRotate(root.right);
return leftRotate(root);
}
return root;
}
private int getBalanceFactor(TreeNode node) {
if (node == null) {
return 0;
}
return getHeight(node.left) - getHeight(node.right);
}
private int getHeight(TreeNode node) {
if (node == null) {
return 0;
}
return Math.max(getHeight(node.left), getHeight(node.right)) + 1;
}
private TreeNode leftRotate(TreeNode node) {
TreeNode newRoot = node.right;
node.right = newRoot.left;
newRoot.left = node;
return newRoot;
}
private TreeNode rightRotate(TreeNode node) {
TreeNode newRoot = node.left;
node.left = newRoot.right;
newRoot.right = node;
return newRoot;
}
public TreeNode generateBalancedBST(int h) {
TreeNode root = null;
for (int i = 1; i <= Math.pow(2, h) - 1; i++) {
root = insert(root, i);
}
return root;
}
通过上述代码,我们可以实现计算高度为 h 的平衡二叉树。这里采用 AVL 树的旋转算法来保证平衡。对于插入新节点的时候需要关注根节点的平衡因子,在插入新节点之后及时调整树的结构,使得树的高度保持在 h 的范围内。