数据结构与算法4:二叉树1(二叉查找树)
来源:互联网 发布:修改域名dns 编辑:程序博客网 时间:2024/05/16 11:20
二叉查找树需要注意的是删除操作,网上很多实现有些问题,还是自己手工实现一遍
#include <stdio.h>#include <stdlib.h>typedef int Type;typedef struct tag_BSTNode{ Type key; struct tag_BSTNode *left; struct tag_BSTNode *right;} BSTNode,*BSTree;BSTNode* bst_search1(BSTree root, Type key){ if (root == NULL || root->key==key) return root; if (key < root->key) return bst_search1(root->left, key); else return bst_search1(root->right, key);}BSTNode* bst_search2(BSTree root, Type key){ while ((key != root->key) && (root != NULL)) { if (key < root->key) { root = root->left; } else { root = root->right; } } return root;}BSTNode *bst_adddata(BSTree root, Type key){ BSTNode *tmp; if (NULL == root) { root = (BSTNode *) malloc(sizeof(BSTNode)); root->key = key; root->left = NULL; root->right = NULL; } else { tmp = root; while (tmp != NULL) { if (key < tmp->key) { if (NULL != tmp->left) { tmp = tmp->left; } else { tmp->left = (BSTNode *) malloc(sizeof(BSTNode)); tmp->left->left = NULL; tmp->left->right = NULL; tmp->left->key = key; break; } } else { if (NULL != tmp->right) { tmp = tmp->right; } else { tmp->right = (BSTNode *) malloc(sizeof(BSTNode)); tmp->right->left = NULL; tmp->right->right = NULL; tmp->right->key = key; break; } } } } return root;}BSTNode *bst_deldata(BSTree root, Type key){ BSTNode *tmp = root; BSTNode *parent = NULL; BSTNode *prenode = NULL; BSTNode *prenode_parent = NULL; while (tmp != NULL) { if (key < tmp->key) { parent = tmp; tmp = tmp->left; } else if(key > tmp->key) { parent = tmp; tmp = tmp->right; } else { break; } } if (NULL == tmp) { return root; } if ((NULL == tmp->right) && (NULL == tmp->left)) { if (parent != NULL) { if (parent->right == tmp) { parent->right = NULL; free(tmp); } else { parent->left = NULL; free(tmp); } } else { root = NULL; } } else if (NULL == tmp->right) { if (parent != NULL) { if (parent->right == tmp) { parent->right = tmp->left; free(tmp); } else { parent->left = tmp->left; free(tmp); } } else { root = tmp->left; free(tmp); } } else if (NULL == tmp->left) { if (parent != NULL) { if (parent->right == tmp) { parent->right = tmp->right; free(tmp); } else { parent->left = tmp->right; free(tmp); } } else { root = tmp->right; free(tmp); } } else { parent = tmp; prenode = tmp->left; while (NULL != prenode->right) { prenode_parent = prenode; prenode = prenode->right; } tmp->key = prenode->key; if (prenode == tmp->left) { tmp->left = prenode->left; } else { prenode_parent->right = prenode->left; } free(prenode); } return root;}void preorder_bstree(BSTree root){ if(root != NULL) { printf("%d ", root->key); preorder_bstree(root->left); preorder_bstree(root->right); }}void inorder_bstree(BSTree root){ if(root != NULL) { inorder_bstree(root->left); printf("%d ", root->key); inorder_bstree(root->right); }}void postorder_bstree(BSTree root){ if(root != NULL) { postorder_bstree(root->left); postorder_bstree(root->right); printf("%d ", root->key); } }BSTNode *bst_max(BSTree root){ while(NULL != root) { if (NULL != root->right) { root = root->right; } else { break; } } return root;}BSTNode *bst_min(BSTree root){ while(NULL != root) { if (NULL != root->left) { root = root->left; } else { break; } } return root;}int main(){ Type data[] = {1,2,3,4,5,6,7,8,9,10}; Type data2[] = {5,4,3,2,1,6,7,8,9,10}; BSTree root = NULL; int i; for(i = 0; i < 10; i++) { root = bst_adddata(root, data[i]); } preorder_bstree(root); printf("\n"); inorder_bstree(root); printf("\n"); postorder_bstree(root); printf("\n"); printf("\n"); for(i = 0; i < 10; i++) { root = bst_deldata(root, data[i]); preorder_bstree(root); printf("\n"); } for(i = 0; i < 10; i++) { root = bst_adddata(root, data[i]); } for(i = 9; i >= 0; i--) { root = bst_deldata(root, data[i]); preorder_bstree(root); printf("\n"); } for(i = 0; i < 10; i++) { root = bst_adddata(root, data2[i]); } preorder_bstree(root); printf("\n"); inorder_bstree(root); printf("\n"); postorder_bstree(root); printf("\n"); printf("\n"); for(i = 0; i < 10; i++) { root = bst_deldata(root, data2[i]); preorder_bstree(root); printf("\n"); } for(i = 0; i < 10; i++) { root = bst_adddata(root, data2[i]); } root = bst_deldata(root, data2[3]); inorder_bstree(root); printf("\n"); root = bst_adddata(root, data2[3]); inorder_bstree(root); printf("\n"); root = bst_deldata(root, data2[3]); inorder_bstree(root); printf("\n"); }
阅读全文
0 0
- 数据结构与算法4:二叉树1(二叉查找树)
- 数据结构与算法(二叉查找树)
- 数据结构与算法06:二叉查找树
- 《数据结构与算法分析》--二叉查找树
- <数据结构与算法>之二叉查找树
- 数据结构与算法_二叉查找树
- 数据结构与算法分析-树、二叉树、二叉查找树
- 数据结构与算法JavaScript - 二叉树和二叉查找树
- 数据结构与算法(C语言版)__二叉查找树
- 数据结构与算法-二叉查找树(java描述)
- 数据结构查找算法之二叉查找树
- 【数据结构与算法分析】二叉查找树与AVL树
- 数据结构与算法7:哈夫曼树,二叉查找树,平衡二叉查找树,B树,B+树
- 【经典数据结构算法】(1)二叉查找树与双向链表之间的转换
- 数据结构与算法分析-二叉查找树的实现
- 【数据结构与算法基础】二叉查找树 / Binary Search Tree
- 【算法与数据结构】查找二叉树的实现
- 数据结构与算法简记:二叉查找树相关操作
- Lua 简介
- 记录
- Python 3.6 json和pickle的dump和load方法
- php 安装 event 和 libevent 扩展
- Snapshot--使用Snapshot来还原数据库
- 数据结构与算法4:二叉树1(二叉查找树)
- 迟到一年HashMap解读
- Nginx配置负载均衡
- 性能测试应该怎么做?
- echarts echarts-x echarts-gl 3D地球
- 九九乘法表
- VR资源哪里找?
- Spring Boot 整合 RabbitMQ 之 Fanout Exchange模式 (三)
- git命令图解