二叉查找树
来源:互联网 发布:vmware mac win10镜像 编辑:程序博客网 时间:2024/04/29 15:12
有点问题,不细究。
以后填
二叉搜索树定义:左边的小于右边的。
所以无论是增加,查找,删除,都秉承这一点,就可以大大优化速度。
// searchTree.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <stdlib.h>#include <stdio.h>#include <time.h>#define ERROR printf("out of space!");struct ElementType;struct MySearchTree;typedef struct MySearchTree * Tree;//函数体Tree Find(ElementType element, Tree T);Tree FindMax(Tree T);Tree FindMin(Tree T);Tree Insert(ElementType element, Tree T);Tree Delete(ElementType element, Tree T);void visit(Tree T, int depth);struct ElementType{int num;};struct MySearchTree{ElementType element;Tree left;Tree right;};int main(){srand((unsigned)time(NULL));Tree T = NULL;struct ElementType em;em.num = 2500;T = Insert(em, T);int *a = (int *)malloc(100 * sizeof(int));for (int i = 0; i < 100; i++){a[i] = i*i;}for (int i = 0; i < 20; i++){int number = rand() % 100;em.num = a[number];Insert(em, T);}em.num = 99;Insert(em, T);visit(T, 0);printf("MAX:%d\n", FindMax(T)->element.num);printf("MIN:%d", FindMin(T)->element.num);Delete(em, T);printf("\n");visit(T, 0);return 0;}Tree Find(ElementType element, Tree T){if (T == NULL){return NULL;}//注意这里是if else 所以时间复杂度不是很高(即每次递归FInd(right)或者Find(left)只是选择)if (T->element.num > element.num){return Find(element, T->left);}else if (T->element.num < element.num){return Find(element, T->right);}else {return T;}}Tree FindMax(Tree T){if (T == NULL){return NULL;}else{if (T->right == NULL){return T;}else {return FindMax(T->right);}}}Tree FindMin(Tree T){if (T == NULL){return NULL;}else{if (T->left == NULL){return T;}else {return FindMin(T->left);}}}Tree Insert(ElementType element, Tree T){if (T == NULL){T = (Tree)malloc(sizeof(struct MySearchTree));T->element = element;T->left = NULL;T->right = NULL;}else if (T->element.num > element.num){T->left = Insert(element, T->left);}else if (T->element.num < element.num){T->right = Insert(element, T->right);}return T;}void visit(Tree T, int depth){if (T != 0){if (T->element.num != -1){printf("em: %d-------depth:%d\n", T->element.num, depth);depth++;visit(T->left, depth);visit(T->right, depth);}if (T->left != NULL){if (T->left->element.num == -1) {free(T->left);T->left = NULL;}}if (T->right != NULL){if (T->right->element.num == -1) {free(T->right);T->right = NULL;}}}}Tree Delete(ElementType element, Tree T){Tree TNode = Find(element, T);Tree TNode2 = NULL;//判断是否存在元素if (TNode == NULL){ERRORreturn NULL;}else{//存在则进行删除操作,这里有三种情况。//no1.该节点有两个子节点//no2.该节点有两个以下的子节点//no3.没有子节点if (TNode->left == NULL&&TNode->right == NULL){////TNode = NULL;TNode->element.num = -1;return TNode;}if (TNode->left != NULL&&TNode->right != NULL){//两个子节点,则找到右支脉的最小值,代替其TNode2 = FindMin(TNode->right);printf("MMMMMIN:%d\n", TNode2->element.num);TNode->element = TNode2->element;return Delete(TNode->element, TNode->right);}else if (TNode->left != NULL){TNode->element = TNode->left->element;TNode->left = Delete(TNode->element, TNode->left);}else if (TNode->right != NULL){TNode->element = TNode->right->element;TNode->right = Delete(TNode->element, TNode->right);}}}
0 0
- 查找--二叉查找树
- 二叉树、二叉查找树
- 二叉树 & 二叉查找树
- 【查找结构】二叉查找树
- 查找之二叉树查找
- 查找之二叉树查找
- 查找:二叉查找树总结
- 二叉树查找树...
- 二叉树查找树
- 查找--遍历二叉树
- 二叉查找树
- 二叉查找树实现
- 二叉查找树
- 动态二叉查找树
- 最优二叉查找树
- 二叉查找树
- 二叉查找树
- 平衡二叉查找树
- Java——正则表达式_初识网络爬虫
- 程序设计语言的基本成分
- AI
- n个学生按此规定走完后,长廊里电灯有几盏亮着
- openresty 前端开发入门三之JSON篇
- 二叉查找树
- HDU 5691
- 高通平台lk下调屏小结
- Python Cookbook 2——Python技巧
- i++ 、++i 、i-- 、--i 的效率问题
- 《影响力》
- 易语言数字指令编程大全(发送信息代码数据集合)
- Leetcode 45. Jump Game II
- Spring学习(三)