数据结构 平衡二叉树

本文介绍了平衡二叉树的概念,探讨了在二叉查找树中出现的问题及平衡二叉树如何通过限制节点度数差异来提高效率。接着详细阐述了左旋和右旋的过程,包括四种旋转情况的处理,旨在保持树的平衡,提升搜索性能。
摘要由CSDN通过智能技术生成

1. 平衡二叉树的基本概念

1.1二叉查找树的问题

在极端的情况下,二叉树就会转换成链表,高度太高,效率变低

1.2平衡二叉树的概念

任意结点的左子树或右子树的度相差 不超过1

1.3平衡二叉树的作用

通过降低树的高度,从而提高效率


2. 平衡二叉树的左旋右旋

2.1 左旋或者右旋的触发时机

当在树中进行增删操作后,如果破坏了原本树的平衡性,此时就会用左旋或右旋调整树,以达到平衡

2.2 左旋的过程

  1. 让当前结点成为当前结点右子结点的左子结点;
  2. 让当前结点的右子结点的左子结点成为当前结点的右子结点;
  3. 让当前结点的父结点指向当前结点的右子结点;

左旋:就是将结点的右侧往左拉,原先的右子结点变成新的父结点,并把多余的左子结点出让给已降级的根结点当右子结点;

2.3右旋的过程

  1. 让当前结点成为当前结点左子节点的右子结点;
  2. 让当前结点的左子结点的右子结点成为当前结点的左子结点;
  3. 让当前结点的父结点指向点前结点的左子结点;

右旋:就是将结点的左侧往右拉,原先左子结点变成了新的父结点,并 把多余的右子结点让出给已降级的根结点当右子结点


2.4平衡二叉树旋转的四种情况

2.4.1左左

  • 当某个结点的左子
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当然,下面是一个简单的平衡二叉树的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 typedef struct Node { int data; // 节点值 struct Node* left; // 左子节点指针 struct Node* right; // 右子节点指针 int height; // 节点高度 } Node; // 计算节点的高度 int height(Node* node) { if (node == NULL) { return 0; } return node->height; } // 获取两个数中较大的值 int max(int a, int b) { return (a > b) ? a : b; } // 创建一个新节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; newNode->height = 1; return newNode; } // 执行右旋操作 Node* rightRotate(Node* y) { Node* x = y->left; Node* T2 = x->right; x->right = y; y->left = T2; y->height = max(height(y->left), height(y->right)) + 1; x->height = max(height(x->left), height(x->right)) + 1; return x; } // 执行左旋操作 Node* leftRotate(Node* x) { Node* y = x->right; Node* T2 = y->left; y->left = x; x->right = T2; x->height = max(height(x->left), height(x->right)) + 1; y->height = max(height(y->left), height(y->right)) + 1; return y; } // 获取节点的平衡因子 int getBalanceFactor(Node* node) { if (node == NULL) { return 0; } return height(node->left) - height(node->right); } // 插入节点 Node* insertNode(Node* node, int data) { if (node == NULL) { return createNode(data); } if (data < node->data) { node->left = insertNode(node->left, data); } else if (data > node->data) { node->right = insertNode(node->right, data); } else { // 忽略插入相同的节点 return node; } node->height = 1 + max(height(node->left), height(node->right)); int balanceFactor = getBalanceFactor(node); // 左-左情况,执行右旋操作 if (balanceFactor > 1 && data < node->left->data) { return rightRotate(node); } // 右-右情况,执行左旋操作 if (balanceFactor < -1 && data > node->right->data) { return leftRotate(node); } // 左-右情况,先对左子节点进行左旋,再对当前节点进行右旋 if (balanceFactor > 1 && data > node->left->data) { node->left = leftRotate(node->left); return rightRotate(node); } // 右-左情况,先对右子节点进行右旋,再对当前节点进行左旋 if (balanceFactor < -1 && data < node->right->data) { node->right = rightRotate(node->right); return leftRotate(node); } return node; } // 中序遍历二叉树 void inorderTraversal(Node* root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } } int main() { Node* root = NULL; root = insertNode(root, 10); root = insertNode(root, 20); root = insertNode(root, 30); root = insertNode(root, 40); root = insertNode(root, 50); root = insertNode(root, 25); printf("中序遍历结果:"); inorderTraversal(root); return 0; } ``` 这段代码实现了一个平衡二叉树的插入和中序遍历操作。你可以根据需要自行修改和扩展。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aming_sth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值