二叉搜索树

来源:互联网 发布:淘宝门头在线制作 编辑:程序博客网 时间:2024/06/06 02:00
#include <stdio.h>#include <string.h>#include <stdlib.h>//插入和删除函数必须都得以返回指针的形式实现//对于插入,看其最后的NULL时插入就能看出//对于删除,本质删除的是只有一个儿子和没有儿子的节点,想其删除没有儿子的节点的情况//若不返回指针,此节点的父亲就有个指针指向非法区了struct TreeNode{int Element;struct TreeNode* Left;struct TreeNode* Right;};struct TreeNode* Init(){//初始化return NULL;}void PreTraversal(struct TreeNode* BinSearchTree)//前序遍历  {      if(BinSearchTree!=NULL){           printf("%d ",BinSearchTree->Element);           PreTraversal(BinSearchTree->Left);           PreTraversal(BinSearchTree->Right);      }    return;  }  struct TreeNode* Find(int data,struct TreeNode* BinSearchTree)//查找{if(BinSearchTree==NULL)return NULL;else if(BinSearchTree->Left!=NULL&&data<BinSearchTree->Element)return BinSearchTree->Left;else if(BinSearchTree->Right!=NULL&&data>BinSearchTree->Element)return BinSearchTree->Right;else return BinSearchTree;}struct TreeNode* FindMax(struct TreeNode* BinSearchTree)//查找最大值所在的节点{if(BinSearchTree==NULL)return NULL;else if(BinSearchTree->Right!=NULL)return FindMax(BinSearchTree->Right);elsereturn BinSearchTree;}struct TreeNode* FindMin(struct TreeNode* BinSearchTree)//查找最小值所在的节点{if(BinSearchTree==NULL)return NULL;else if(BinSearchTree->Left!=NULL)return FindMin(BinSearchTree->Left);elsereturn BinSearchTree;}struct TreeNode* Insert(int data,struct TreeNode* BinSearchTree)//插入{if(BinSearchTree==NULL){BinSearchTree=(struct TreeNode*)malloc(sizeof(struct TreeNode));BinSearchTree->Element=data;BinSearchTree->Left=NULL;BinSearchTree->Right=NULL;return BinSearchTree;}else if(data<BinSearchTree->Element)BinSearchTree->Left=Insert(data,BinSearchTree->Left);else if(data>BinSearchTree->Element)BinSearchTree->Right=Insert(data,BinSearchTree->Right);elseprintf("ERROR\n");return BinSearchTree;}struct TreeNode* Delete(int data,struct TreeNode* BinSearchTree)//删除{if(BinSearchTree==NULL)return NULL;else if(data>BinSearchTree->Element)BinSearchTree->Right=Delete(data,BinSearchTree->Right);else if(data<BinSearchTree->Element)BinSearchTree->Left=Delete(data,BinSearchTree->Left);else if(BinSearchTree->Left&&BinSearchTree->Right){//删除有两个孩子的节点,可找左树最大与右树最小代替其,本质删除没有儿子的节点struct TreeNode* Temp=FindMin(BinSearchTree->Right);BinSearchTree->Element=Temp->Element;BinSearchTree->Right=Delete(Temp->Element,BinSearchTree->Right);}else{//删除有一个/零个孩子的节点struct TreeNode* Temp;Temp=BinSearchTree;if(BinSearchTree->Left!=NULL)BinSearchTree=BinSearchTree->Left;else//此处包含了右儿子也为空的情况,即零个孩子BinSearchTree=BinSearchTree->Right;free(Temp);}return BinSearchTree;}int main(){struct TreeNode* BinSearchTree;    //初始化    BinSearchTree=Init();    //插入    BinSearchTree=Insert(4,BinSearchTree);    BinSearchTree=Insert(3,BinSearchTree);    BinSearchTree=Insert(6,BinSearchTree);    BinSearchTree=Insert(5,BinSearchTree);    BinSearchTree=Insert(7,BinSearchTree);    BinSearchTree=Insert(2,BinSearchTree);    //遍历一遍,便于检验代码    PreTraversal(BinSearchTree);    putchar('\n');    //删除有零个孩子的2节点    BinSearchTree=Delete(2,BinSearchTree);    PreTraversal(BinSearchTree);    putchar('\n');    //重新插入2    BinSearchTree=Insert(2,BinSearchTree);    //删除有一个孩子的3节点    Delete(3,BinSearchTree);    PreTraversal(BinSearchTree);    putchar('\n');    //删除有两个孩子的6节点    Delete(6,BinSearchTree);    PreTraversal(BinSearchTree);    putchar('\n');    }

1 0
原创粉丝点击