二叉排序树
来源:互联网 发布:手机最好用防蹭网软件 编辑:程序博客网 时间: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;
}
#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
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- Jenkins知识地图
- 正则表达式30分钟入门教程
- 九度oj-1123-采药
- [转]关于 "the serializable class XXX does not declare a static final seriaVersionUID..."的问题 (2012-03-1
- Android下DLNA和UPnP的研究以及问题
- 二叉排序树
- 源码推荐:保存app内容到手机桌面,类AppStore横向滚动
- 阶乘因式分解(一)
- Android应用开发人员的10个建议
- vi常用命令
- 设计模式之简单工厂
- 黑马程序员Java基础第七章-----单例设计模式,异常
- C#探秘系列(五)
- 34. PHP 执行运算符