平衡二叉树的左旋右旋代码优化
时间: 2024-12-01 20:12:55 浏览: 24
平衡二叉树,如AVL树或红黑树,通过旋转操作来维持其高度平衡,避免极端情况下的性能下降。左旋(left rotation)和右旋(right rotation)是常见的调整方法:
1. 左旋(当节点右侧子树比左侧子树高两个及以上时):
- 首先将右子树作为新根
- 然后原右子树的左子树成为新的右子树
- 最后,更新节点的指针
```python
def left_rotate(node):
new_root = node.right
node.right = new_root.left
new_root.left = node
return new_root
```
2. 右旋(当节点左侧子树比右侧子树高两个及以上时):
- 先将左子树作为新根
- 原左子树的右子树成为新根的左子树
- 更新节点的指针
```python
def right_rotate(node):
new_root = node.left
node.left = new_root.right
new_root.right = node
return new_root
```
为了优化代码,可以考虑编写通用的旋转函数,接受旋转方向作为参数,减少代码重复。同时,平衡二叉树的插入和删除操作通常会涉及旋转,需要结合判断条件来决定何时以及如何进行旋转。
相关问题
平衡二叉树的左旋右旋代码
平衡二叉树是一种特殊的二叉搜索树,其左子树和右子树的高度差不超过1,可以避免二叉搜索树退化为链表的情况,提高了查找、插入和删除的效率。
平衡二叉树的左旋和右旋是平衡二叉树中常用的操作,用于调整树的平衡性。左旋是将当前节点的右子树作为新的子树,当前节点成为新子树的左子树;右旋是将当前节点的左子树作为新的子树,当前节点成为新子树的右子树。
以下是平衡二叉树的左旋和右旋代码:
```
// 左旋
void AVLTree::leftRotate(AVLTreeNode* &node) {
AVLTreeNode* rightChild = node->right;
node->right = rightChild->left;
rightChild->left = node;
node = rightChild;
// 更新节点高度
node->left->height = max(height(node->left->left), height(node->left->right)) + 1;
node->height = max(height(node->left), height(node->right)) + 1;
}
// 右旋
void AVLTree::rightRotate(AVLTreeNode* &node) {
AVLTreeNode* leftChild = node->left;
node->left = leftChild->right;
leftChild->right = node;
node = leftChild;
// 更新节点高度
node->right->height = max(height(node->right->left), height(node->right->right)) + 1;
node->height = max(height(node->left), height(node->right)) + 1;
}
```
平衡二叉树左旋,右旋
平衡二叉树是一种特殊的二叉搜索树,它在插入和删除操作后始终保持两个子树的高度差不超过1。左旋和右旋是两种常见的平衡二叉树调整方法,用于在插入或删除节点后维持平衡。
**左旋(Left Rotation)**:
- 当一个节点的右子树比左子树高2个节点以上,并且右子树的左子树非空时,需要进行左旋操作。
- 简单来说,就是将当前节点的右子节点提升到当前节点的位置,然后将原右子节点设置为原右子节点的左子节点,原右子节点的左子节点(如果存在)设为新的右子节点。
- 左旋有助于纠正过度倾斜向右的情况。
**右旋(Right Rotation)**:
- 相反,当一个节点的左子树比右子树高2个节点以上,并且左子树的右子树非空时,需要进行右旋操作。
- 这时,将当前节点的左子节点下移,然后将原左子节点设置为原左子节点的右子节点,原左子节点的右子节点(如果存在)设为新的左子节点。
- 右旋用于纠正过度倾斜向左的情况。
这两个操作都是为了保持平衡二叉树的性质,确保搜索、插入和删除操作的效率。在实际编程中,如C++或Java的红黑树、AVL树等实现中,都会包含针对这些情况的代码来自动调整树的结构。
阅读全文