首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么是红黑树?详述排序红黑树的原理?用C语言实现红黑树算法。内附完整代码。

大家好,我是贤弟!

一、什么是红黑树?

红黑树是一种自平衡二叉查找树,它能够在O(log n)的时间内完成插入、删除和查找操作。

红黑树的节点有两种颜色:红色和黑色,每个节点都有一个颜色属性。

红黑树满足以下性质:

1. 每个节点要么是红色,要么是黑色。

2. 根节点是黑色的。

3. 每个叶子节点(NIL节点,空节点)是黑色的。

4. 如果一个节点是红色的,那么它的两个子节点都是黑色的。

5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。

二、排序红黑树的原理

排序红黑树的原理是将红黑树中的节点按照一定的顺序进行排列,使得每个节点的左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。

具体实现方法是在插入新节点时,按照二叉查找树的插入方法将新节点插入到红黑树中,并根据红黑树的性质进行调整,使得红黑树保持平衡。

三、示例代码

以下是用C语言实现红黑树算法的示例代码:

```#include #include

typedef struct TreeNode { int val; int color; // 0表示黑色,1表示红色 struct TreeNode* left; struct TreeNode* right; struct TreeNode* parent;} TreeNode;

TreeNode* createNode(int val) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; node->color = 1; node->left = NULL; node->right = NULL; node->parent = NULL; return node;}

void leftRotate(TreeNode** root, TreeNode* x) { TreeNode* y = x->right; x->right = y->left; if (y->left != NULL) { y->left->parent = x; } y->parent = x->parent; if (x->parent == NULL) { *root = y; } else if (x == x->parent->left) { x->parent->left = y; } else { x->parent->right = y; } y->left = x; x->parent = y;}

void rightRotate(TreeNode** root, TreeNode* y) { TreeNode* x = y->left; y->left = x->right; if (x->right != NULL) { x->right->parent = y; } x->parent = y->parent; if (y->parent == NULL) { *root = x; } else if (y == y->parent->left) { y->parent->left = x; } else { y->parent->right = x; } x->right = y; y->parent = x;}

void insertFixup(TreeNode** root, TreeNode* z) { while (z->parent != NULL && z->parent->color == 1) { if (z->parent == z->parent->parent->left) { TreeNode* y = z->parent->parent->right; if (y != NULL && y->color == 1) { z->parent->color = 0; y->color = 0; z->parent->parent->color = 1; z = z->parent->parent; } else { if (z == z->parent->right) { z = z->parent; leftRotate(root, z); } z->parent->color = 0; z->parent->parent->color = 1; rightRotate(root, z->parent->parent); } } else { TreeNode* y = z->parent->parent->left; if (y != NULL && y->color == 1) { z->parent->color = 0; y->color = 0; z->parent->parent->color = 1; z = z->parent->parent; } else { if (z == z->parent->left) { z = z->parent; rightRotate(root, z); } z->parent->color = 0; z->parent->parent->color = 1; leftRotate(root, z->parent->parent); } } } (*root)->color = 0;}

void insertNode(TreeNode** root, int val) { TreeNode* z = createNode(val); TreeNode* y = NULL; TreeNode* x = *root; while (x != NULL) { y = x; if (z->val < x->val) { x = x->left; } else { x = x->right; } } z->parent = y; if (y == NULL) { *root = z; } else if (z->val < y->val) { y->left = z; } else { y->right = z; } insertFixup(root, z);}

void inorderTraversal(TreeNode* root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); }}

int main() { TreeNode* root = NULL; insertNode(&root, 5); insertNode(&root, 3); insertNode(&root, 7); insertNode(&root, 1); insertNode(&root, 9); insertNode(&root, 2); insertNode(&root, 6); inorderTraversal(root); return 0;}```

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OADlEHwreibi0t4G5V1H_2LQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券