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

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

大家好,我是贤弟!

一、什么是排序二叉树?

排序二叉树(binary search tree)是一种特殊的二叉树,它能够自动对插入的数据进行排序,同时也支持高效的查找、插入和删除操作。

其原理是利用二叉搜索树的性质:对于任意节点,其左子树的所有节点值均小于该节点值,右子树的所有节点值均大于该节点值。

二、排序二叉树算法的原理

排序二叉树算法的原理如下:

1、初始化:将根节点设置为NULL。

2、插入新元素:

a、若根节点为空,则将该元素作为根节点;

b、否则,若该元素小于当前节点值,则将该元素插入到左子树中;否则将该元素插入到右子树中。递归执行该步骤直到找到一个空的叶子结点,将该元素插入到该叶子结点。

3、搜索元素:

a、若根节点为空,则返回NULL;

b、若该元素等于当前节点值,则返回该节点;

c、否则,若该元素小于当前节点值,则在左子树中递归搜索;否则在右子树中递归搜索。

4、删除元素:

a、若根节点为空,则不进行任何操作;

b、若该元素等于当前节点值,则根据其子节点情况进行删除操作,删除后需要保证该树仍然满足二叉搜索树性质;

c、否则,若该元素小于当前节点值,则在左子树中递归删除;否则在右子树中递归删除。

三、代码示例

以下是使用C语言实现排序二叉树算法的代码:

#include #include

typedef struct Node { int val; struct Node* left; struct Node* right;} Node;

// 初始化二叉搜索树Node* init() { return NULL;}

// 插入新元素Node* insert(Node* root, int val) { if (root == NULL) { // 根节点为空,新建根节点 Node* node = (Node*)malloc(sizeof(Node)); node->val = val; node->left = NULL; node->right = NULL; return node; } else if (val < root->val) { // 插入左子树 root->left = insert(root->left, val); } else if (val > root->val) { // 插入右子树 root->right = insert(root->right, val); } return root;}

// 搜索元素Node* search(Node* root, int val) { if (root == NULL || root->val == val) { // 找到目标元素或者搜索到空节点 return root; } else if (val < root->val) { // 在左子树中递归搜索 return search(root->left, val); } else { // 在右子树中递归搜索 return search(root->right, val); }}

// 找到当前节点的最小值元素(即左子树中最右侧的叶子节点)Node* getMin(Node* node) { if (node == NULL) { return NULL; } else if (node->left == NULL) { return node; } else { return getMin(node->left); }}

// 删除目标元素Node* delete(Node* root, int val) { if (root == NULL) { // 没有找到目标元素,直接返回空 return NULL; } else if (val < root->val) { // 在左子树中递归删除 root->left = delete(root->left, val); } else if (val > root->val) { // 在右子树中递归删除 root->right = delete(root->right, val); } else { // 找到目标元素,进行删除操作 if (root->left == NULL && root->right == NULL) { // 当前节点为叶子节点,直接删除 free(root); root = NULL; } else if (root->left == NULL) { // 当前节点只有右子节点,将右子节点接在当前位置 Node* temp = root; root = root->right; free(temp); } else if (root->right == NULL) { // 当前节点只有左子节点,将左子节点接在当前位置 Node* temp = root; root = root->left; free(temp); } else { // 当前节点既有左子节点又有右子节点,找到左子树中最右侧的叶子结点来顶替被删除节点 Node* temp = getMin(root->right); root->val = temp->val; root->right = delete(root->right, temp->val); } } return root;}

// 中序遍历(按照升序排列)void inorder(Node* root) { if (root == NULL) { return; } inorder(root->left); printf("%d ", root->val); inorder(root->right);}

int main() { Node* root = init(); root = insert(root, 3); root = insert(root, 1); root = insert(root, 5); root = insert(root, 4); root = insert(root, 2);

printf("排序后的结果:"); inorder(root); printf("\n");

root = delete(root, 1); printf("删除元素1后,排序后的结果:"); inorder(root); printf("\n");

root = delete(root, 5); printf("删除元素5后,排序后的结果:"); inorder(root); printf("\n");

return 0;}

注意:

以上代码实现了初始化、插入、搜索、删除和中序遍历等基本操作。

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

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券