平衡二叉树,是一种自平衡的二叉搜索树,也称为 AVL 树。在平衡二叉树中,任何节点的两个子树的高度差不超过 1。平衡二叉树的构造和维护,是一个经典的算法问题,本文将以「平衡二叉树例题」为题目,从多个角度分析平衡二叉树的相关问题。
1. 平衡因子与旋转操作
平衡二叉树的平衡因子,定义为该节点的左子树高度减去右子树高度。如果平衡因子的绝对值超过 1,就需要进行旋转操作来保持平衡。
常用的旋转操作有左旋和右旋。左旋是将一个节点的右子树旋转到它的左子树上,右旋是将一个节点的左子树旋转到它的右子树上。不同的旋转操作可用于不同的平衡调整情况。
例如,插入节点 15 后,节点 10 的平衡因子为 2,需要进行右旋操作。左旋和右旋的代码实现如下:
```
// 右旋操作
TreeNode* rotateRight(TreeNode* root) {
TreeNode* newRoot = root->left;
root->left = newRoot->right;
newRoot->right = root;
updateHeight(root);
updateHeight(newRoot);
return newRoot;
}
// 左旋操作
TreeNode* rotateLeft(TreeNode* root) {
TreeNode* newRoot = root->right;
root->right = newRoot->left;
newRoot->left = root;
updateHeight(root);
updateHeight(newRoot);
return newRoot;
}
```
2. 插入节点与删除节点
在平衡二叉树中,插入节点和删除节点会引起平衡调整。插入节点的过程类似于二叉搜索树,但是要注意在插入完成后,对从插入节点到根节点的路径上所有节点进行平衡调整。
删除节点的过程比较复杂,分为三种情况:删除的节点没有子节点、删除的节点只有一个子节点、删除的节点有两个子节点。对于每种情况,需要分别进行处理并进行平衡调整。
例如,在以下平衡二叉树中删除节点 7,需要对节点 6 进行旋转操作以保持平衡:
```
10
/ \
6 11
/ \ \
4 7 12
\
8
```
3. 时间复杂度分析
平衡二叉树的时间复杂度,与树的高度有关。由于平衡二叉树的树高始终为 O(log n),因此插入节点、删除节点、查找节点的时间复杂度均为 O(log n)。
需要注意的是,在一些最坏情况下,平衡二叉树可能失去平衡,树高变为 O(n),此时插入节点、删除节点、查找节点的时间复杂度均为 O(n)。为了避免这种情况的发生,可以采用红黑树等其它自平衡的数据结构。
微信扫一扫,领取最新备考资料