二叉排序树

来源:互联网 发布:手机最好用防蹭网软件 编辑:程序博客网 时间:2024/06/06 23:51
#include <stdio.h>
#include <malloc.h>
typedef struct SortNode
{
int data;
struct SortNode *left;
struct SortNode *right;
}SortTree,*PSortTree;
  
  bool HaveElem(PSortTree pHead,int num)

//如果没有找到元素,则返回false,如果找到了元素,则返回指向其节点的指针
PSortTree pTraverse=pHead;
while(pTraverse!=NULL)
{
if(num<pTraverse->data)
{
pTraverse=pTraverse->left;
}
else if(num>pTraverse->data)
{
pTraverse=pTraverse->right;
}
else

return true;
}
}
return false;
}
bool FindDeleteNode(PSortTree phead,int number,PSortTree * pPoint,PSortTree * pParents)
{
bool flag=false;
(*pPoint)=(*pParents)=phead;
while((*pPoint)!=NULL)
{

if(number<(*pPoint)->data)
{
*pParents=*pPoint;
*pPoint=(*pPoint)->left;

}
else if(number>(*pPoint)->data)
{
*pParents=*pPoint;
*pPoint=(*pPoint)->right;

}
else
{

 flag=true;
 break;
}

}




return flag;




}
void DeleteNode(PSortTree pHead,int number)
{
PSortTree pPoint,pParents;
PSortTree pFront,pRear;


if(FindDeleteNode(pHead,number,&pPoint,&pParents))
{
printf("now the number is %d\n",*pPoint);
  //删除分为三种情况,第一种是叶子节点  第二种是有左孩子或者右孩子,第三种是既有左孩子还有右孩子
//pPoint 为指向其待删除元素的指针
if(pPoint->left==NULL)
{
pParents->left=pPoint->right;
free(pPoint);
}
else if(pPoint->right==NULL)
{
pParents->left=pPoint->left;
free(pPoint);
}
else
{
  //本情况对应于其节点既有左孩子 还有右孩子,此时应该删除其左树的最右边的节点  这个节点是其小于它节点中最大的
pFront=pPoint;
pRear=pFront->left;
//开始循环   两个指针互相交替前进
while(pRear->right)
{
pFront=pRear;
pRear=pRear->right;
}
pPoint->data=pRear->data;
if(pFront==pPoint)
{
pFront->left=pRear->left;
}
else
{
pFront->right=pRear->left;
}
free(pRear);
}
       
}
}
 
void TraverseTree(PSortTree pHead)
{
if(pHead==NULL)
{
 return ;
}
printf("%d ",pHead->data);
TraverseTree(pHead->left);
TraverseTree(pHead->right);
}






void InsertNode(PSortTree pHead,int num)
{
//设置两个指针,一个指向其前节点,一个指向其下一个节点  循环跳出的条件是下一个节点为空
PSortTree pFront,pRear,p;
pFront=pHead;
if(num<pHead->data)
{
pRear=pHead->left;
}
else
{
pRear=pHead->right;
}
while(pRear!=NULL)
{
pFront=pRear;
if(num<pRear->data)
{
pRear=pRear->left;
}
else
{
pRear=pRear->right;
}
}
//prear points to the null node,pfront points to the node going to be inserted
p=(PSortTree)malloc(sizeof(SortTree));
p->data=num;
p->left=NULL;
p->right=NULL;
if(num<pFront->data)
{
pFront->left=p;
}
else
{
pFront->right=p;
}




}


PSortTree InitSortTree(int a[],int len)
{
PSortTree pHead,pPoint;
    int i=0;
pHead=(PSortTree)malloc(sizeof(SortTree));
pHead->data=a[0];
pHead->left=NULL;
pHead->right=NULL;
for(i=1;i<len;i++)
{


    if(!HaveElem(pHead,a[i]))
{
InsertNode(pHead,a[i]);
}







}
return pHead;
}
int main()
{
PSortTree pHead;
int a[]={62,88,58,47,35,73,51,99,37,93};
pHead=InitSortTree(a,10);
InsertNode(pHead,1);

   DeleteNode(pHead,47);
   TraverseTree(pHead);
return 0;
}
0 0
原创粉丝点击