📜  计算高度为h的平衡二叉树(1)

📅  最后修改于: 2023-12-03 15:12:05.490000             🧑  作者: Mango

计算高度为h的平衡二叉树

平衡二叉树是指一棵空树或者其左右两棵子树的高度差不超过 1,并且左右两棵子树都是平衡二叉树。因此,平衡二叉树的高度相对于其他二叉树来说更加平衡,其查找、插入、删除操作的时间复杂度都能保证在 O(logn) 的级别。

为了实现高度为 h 的平衡二叉树,我们需要不断地向平衡二叉树中插入新的节点,直到树的高度达到 h 为止。为了保证平衡,我们需要在插入新节点后及时调整树的结构,重新平衡整个平衡二叉树。

实现思路
  1. 首先,我们需要定义一个二叉树节点类,包含节点的值、左右子节点等信息;
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}
  1. 接下来,我们需要实现向平衡二叉树中插入新节点的方法。这里采用递归实现,每一次插入节点都会重新计算树的平衡因子,根据不同的平衡因子进行不同的旋转操作以保持树的平衡。
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;
}
  1. 最后,我们需要初始化平衡二叉树,不断向树中插入新节点,直到树的高度达到 h。
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 的范围内。