关于二叉搜索树的一些操作

来源:互联网 发布:黎明杀机n卡优化 编辑:程序博客网 时间:2024/05/22 12:29
#include "stdafx.h"#include "iostream"#include "stdlib.h"#define ElementType inttypedef struct TreeNode *tree;struct TreeNode{ElementType Date;tree Left;tree Right;};tree MakeEmpty(tree T);tree Insert(ElementType x,tree T);tree Find(ElementType x,tree T);tree FindMax(tree T);tree FindMin(tree T);tree Delete(ElementType x,tree T);tree MakeEmpty(tree T){if(T!=NULL){MakeEmpty(T->Left);MakeEmpty(T->Right);free(T);}return NULL;}tree FindMax(tree T){if(T==NULL)return NULL;else if(T->Right==NULL)return T;elsereturn FindMax(T->Right);}tree FindMin(tree T){if(T!=NULL){while(T->Left!=NULL)T=T->Left;}return T;}tree Insert(ElementType x,tree T){if(T==NULL){T=(tree)malloc(sizeof(struct TreeNode));if(T==NULL)printf("error\n");else{T->Date=x;T->Left=T->Right=NULL;}}else if(x>T->Date)T->Right=Insert (x,T->Right);//之前这里光Insert但并没有赋给T->Right,所以树根本没建立起来;else if(x<T->Date)T->Left=Insert(x,T->Left);return T;}tree Find(ElementType x,tree T){if(NULL==T)return NULL;else if(x==T->Date)return T;else if(x>T->Date)return Find(x,T->Right);else    return Find(x,T->Left);}tree Delete(ElementType x,tree T){tree tmp;//T=Find(x,T);if(T==NULL)printf("error");else if(x<T->Date)T->Left=Delete(x,T->Left);else if(x>T->Date)T->Right=Delete(x,T->Right);else if(T->Left&&T->Right)//这里是当树的左右节点都存在的情况,策略是用右子树的最小数据代替要删除的点{tmp=FindMin(T->Right);T->Date=tmp->Date;T->Right=Delete(T->Date,T->Right);}else//只有一个节点或没有的情况;{                 tmp=T; if(T->Left==NULL) T=T->Right; else if(T->Right==NULL) T=T->Left; free(tmp);//这里是要释放原结点}return T;}

原创粉丝点击