Binary Search Tree 又叫二叉查找树,二叉排序树
这是种什么样的树呢?
其实就是根节点的左子树比根节点小 右子树比根节点大 同时 左子树和右子树也是二叉搜索树
代码比较简单 基本用递归实现 比较好理解 只有删除带有左右子树的节点时比较难理解
方法就是 直接在右子树找一个最小的节点 取代要被删除的节点 再继续删除右子树里的节点
详细看代码
1 #include "stdio.h" 2 #include "stdlib.h" 3 typedef struct BinTree 4 { 5 int data; 6 struct BinTree *left; 7 struct BinTree *right; 8 }BinTree; 9 10 BinTree *BinTreeFind(int key,BinTree *t) 11 { 12 while(!t) 13 { 14 if(key>t->data) 15 t=t->right; 16 else if(key<t->data) 17 t=t->left; 18 else 19 return t; 20 } 21 return NULL; 22 } 23 24 BinTree *BinTreeInsert(int key,BinTree *t) 25 { 26 if(!t) 27 { 28 t=(BinTree*)malloc(sizeof(BinTree)); 29 t->data=key; 30 t->left=NULL; 31 t->right=NULL; 32 } 33 else if(key>t->data) 34 t->right=BinTreeInsert(key,t->right); 35 else if(key<t->data) 36 t->left=BinTreeInsert(key,t->left); 37 else 38 return t; 39 } 40 BinTree *Findmin(BinTree *t) 41 { 42 if(t) 43 { 44 while(t->left) 45 t=t->left; 46 } 47 return t; 48 } 49 BinTree *Delete(int key,BinTree *t) 50 { 51 BinTree *temp; 52 if(!t) 53 printf("删除失败"); 54 else if(key<t->data) 55 t->left=Delete(key,t->left); 56 else if(key>t->data) 57 t->right=Delete(key,t->right); 58 else if(t->left && t->right) 59 { 60 temp=Findmin(t->right); 61 62 t->data=temp->data; 63 t->right=Delete(t->data,t->right); 64 } 65 else 66 { 67 temp=t; 68 if(!t->left) 69 t=t->right; 70 else if(!t->right) 71 t=t->left; 72 free(temp); 73 } 74 }
时间: 2024-11-10 17:35:24