树的旋转实现编程怎么写

时间:2025-01-24 19:09:58 游戏攻略

树的旋转操作通常用于保持树的平衡,例如在AVL树中。以下是几种常见旋转操作的实现方法:

左旋转(Left Rotation)

左旋转是将一个节点的右子树变为其左子树,并调整相关节点的高度。以下是一个简单的C语言实现:

```c

include

typedef struct Node {

int data;

struct Node* left;

struct Node* right;

int height;

} Node;

// 获取节点的高度

int height(Node* N) {

if (N == NULL)

return 0;

return N->height;

}

// 右旋转

Node* rightRotate(Node* y) {

Node* x = y->left;

Node* T2 = x->right;

// 执行旋转

x->right = y;

y->left = T2;

// 更新高度

y->height = 1 + height(y->left);

x->height = 1 + height(x->right);

return x;

}

// 左旋转

Node* leftRotate(Node* x) {

Node* y = x->right;

Node* T2 = y->left;

// 执行旋转

y->left = x;

x->right = T2;

// 更新高度

x->height = 1 + height(x->left);

y->height = 1 + height(y->right);

return y;

}

// 获取平衡因子

int getBalance(Node* N) {

if (N == NULL)

return 0;

return height(N->left) - height(N->right);

}

// 插入节点并平衡树

Node* insert(Node* node, int key) {

// 1. 执行标准二叉搜索树插入

if (node == NULL)

return (new Node(key));

if (key < node->data)

node->left = insert(node->left, key);

else if (key > node->data)

node->right = insert(node->right, key);

else // 不允许插入重复值

return node;

// 2. 更新节点高度

node->height = 1 + height(node->left);

// 3. 获取平衡因子

int balance = getBalance(node);

// 4. 如果节点不平衡,则进行旋转

// 左左情况

if (balance > 1 && key < node->left->data)

return rightRotate(node);

// 右右情况

if (balance < -1 && key > node->right->data)

return leftRotate(node);

// 左右情况

if (balance > 1 && key > node->left->data) {

node->left = leftRotate(node->left);

return rightRotate(node);

}

// 右左情况

if (balance < -1 && key < node->right->data) {

node->right = rightRotate(node->right);

return leftRotate(node);

}

return node;

}

// 中序遍历

void inorder(Node* node) {

if (node != NULL) {

inorder(node->left);

printf("%d ", node->data);

inorder(node->right);

}

}

int main() {

Node* root = NULL;

root = insert(root, 10);

root = insert(root, 20);

root = insert(root, 30);

root = insert(root, 40);

root = insert(root, 50);

root = insert(root, 25);

printf("Inorder traversal of the constructed tree is \n");

inorder(root);

return 0;

}

```

右旋转(Right Rotation)

右旋转与左旋转类似,只是将节点的左子树变为其右子树,并调整相关节点的高度。以下是一个简单的C语言实现: