平衡二叉树的 插入 删除 查找 等功能c语言实现 数据结构



在很久很久以前至昨天,一直不理解左旋右旋的概念,只是死记硬背下了旋转的模式。 today 忽然明白了什么叫左旋、右旋。 today is 2015.9.12!周末在公司学习的菜鸟又明白了一个知识点,可喜可贺啊! ps越来越不喜欢csdn了, 谁能告诉我如何去掉最上面这行东东!


PS 每次编辑这篇文章,所有除代码之外的东西都变成了乱码 图片也变成了url 真奇葩! csdn 真的是要别了!   我已经被折磨投了!       中间修改了几次  搞的我想吐 真的不想再用csdn了 。。。。。。


图中的A B C 可能代表多个节点




当A B C 代表多个节点时:




其它几种情况的旋转 可以参考 http://blog.csdn.net/vesper305/article/details/13614403 这篇真的很好那!



有朋友反应下面代码中删除可能有问题, 很久以前的代码  没时间整理了,见谅。

#include<time.h>
#include<stdio.h>  
#include<stdlib.h> 
//左子树比右子树高一
#define LH 1
//左子树和右子树一样高
#define EH 0
//左子树比右子树低一
#define RH -1
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b)((a) <= (b))

typedef struct BSTNode
{
	int data;
	int bf;
	BSTNode * lchild;
	BSTNode * rchild;
}BSTNode;
typedef BSTNode * BSTree;

//	左旋
void leftRotate(BSTree & root) 
{
	BSTree rc = root->rchild;
	root->rchild = rc->lchild;
	rc->lchild = root;
	root = rc;
}
//	右旋
void rightRotate(BSTree & root) 
{
	BSTree
  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
二叉树是一种重要的数据结构,它有多种基本操作,包括创建二叉树、插入节点、删除节点、查找节点等。以下是二叉树的基本操作及使用 C 语言实现: 1. 创建二叉树 创建二叉树的基本思路是:先创建根节点,然后递归地创建左右子树。以下是实现代码: ```c // 定义二叉树结构体 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 创建二叉树 TreeNode* createTree(int val) { TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = val; root->left = NULL; root->right = NULL; return root; } ``` 2. 插入节点 插入节点的基本思路是:先找到插入的位置,然后插入节点。以下是实现代码: ```c // 插入节点 void insert(TreeNode* root, int val) { if (root == NULL) { root = createTree(val); } else if (val < root->val) { if (root->left == NULL) { root->left = createTree(val); } else { insert(root->left, val); } } else { if (root->right == NULL) { root->right = createTree(val); } else { insert(root->right, val); } } } ``` 3. 删除节点 删除节点的基本思路是:先找到待删除的节点,然后判断该节点的子树情况,分三种情况进行处理。以下是实现代码: ```c // 删除节点 TreeNode* delete(TreeNode* root, int val) { if (root == NULL) { return NULL; } 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); return NULL; } else if (root->left == NULL) { TreeNode* temp = root->right; free(root); return temp; } else if (root->right == NULL) { TreeNode* temp = root->left; free(root); return temp; } else { TreeNode* temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->val = temp->val; root->right = delete(root->right, temp->val); } } return root; } ``` 4. 查找节点 查找节点的基本思路是:从根节点开始,递归地搜索左右子树,直到找到目标节点或者到达叶子节点。以下是实现代码: ```c // 查找节点 TreeNode* search(TreeNode* root, int val) { if (root == NULL) { return NULL; } if (root->val == val) { return root; } else if (val < root->val) { return search(root->left, val); } else { return search(root->right, val); } } ``` 以上是二叉树的基本操作及使用 C 语言实现代码。需要注意的是,这里的代码仅仅是示例代码,实际使用时需要根据具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值