二叉搜索树的实现
来源:互联网 发布:如何玩好刘邦知乎 编辑:程序博客网 时间:2024/05/22 15:27
二叉搜索树的删除:
(1)、没有左孩子,直接把右孩子替代删除结点
(2)、有左孩子但左孩子没有右孩子,则把左孩子替代删除结点
(3)、其它,把左孩子的最大的结点替代删除结点
时间复杂度O(logn)
- #include <stdio.h>
- #include <malloc.h>
- struct node {
- node* left;
- node* right;
- int val;
- };
- node* ins(node* p, int val) {
- if (p == NULL) {
- node* q = (node*)malloc(sizeof(node));
- q->left = q->right = NULL;
- q->val = val;
- return q;
- } else {
- if (p->val > val) {
- p->left = ins(p->left, val);
- } else {
- p->right = ins(p->right, val);
- }
- return p;
- }
- }
- bool find(node* p, int val) {
- if (p == NULL) {
- return false;
- } else if (p->val == val) {
- return true;
- } else if (p->val > val) {
- return find(p->left, val);
- } else {
- return find(p->right, val);
- }
- }
- node* del(node* p, int val) {
- if (p == NULL) {
- return NULL;
- } else if (p->val > val) {
- p->left = del(p->left, val);
- } else if (p->val < val) {
- p->right = del(p->right, val);
- } else if (p->left == NULL) {
- node* q = p->right;
- free(p);
- return q;
- } else if (p->left->right == NULL) {
- node* q = p->left;
- q->right = p->right;
- free(p);
- return q;
- } else {
- node* q;
- for (q = p->left; q->right->right != NULL; q = q->right) ;
- node* r = q->right;
- q->right = r->left;
- r->left = p->left;
- r->right = p->right;
- free(p);
- return r;
- }
- return p;
- }
- int main() {
- int a[] = {7, 2, 15, 1, 5, 4, 6, 10, 17, 8, 11, 16, 19};
- int len, i;
- node root;
- root.left = root.right = NULL;
- root.val = 0;
- len = sizeof(a) / sizeof(int);
- for (i = 0; i < len; i++) {
- ins(&root, a[i]);
- }
- if (find(&root, 15)) {
- printf("15 exists\n");
- }
- del(&root, 15);
- if (!find(&root, 15)) {
- printf("15 not exists\n");
- }
- return 0;
- }
- 二叉搜索树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- 搜索二叉树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- 搜索二叉树的实现
- 二叉搜索树的实现
- 【二叉搜索树】二叉搜索树的实现
- 二叉搜索树实现
- 搜索二叉树实现
- 搜索二叉树实现
- 二叉搜索树实现
- fileupload中设置临时文件路径相关问题
- // 比较 strlen(str)和 sizeof(str)的不同
- 跳出循环、常量、枚举、数组、冒泡排序
- C++中数组初始化的方法级不同方法之间的差别
- 该是时候静下心来了
- 二叉搜索树的实现
- 确定大小端模式(主机字节序)
- Jackson框架:Java与Json互转
- FreeRTOS STM32移植笔记
- (3)C语言代码之统计单词个数
- Shell中$参数
- 工作中遇到的JS小记
- iphone 开发的一些小技巧
- windows下eclipse中,涉及源码编译的apk开发——使用系统签名机制