数据结构算法

二叉排序树的非递归删除算法

bool Remove(BSTree &root,DataType x)
{//二叉排序树的非递归删除算法
 //在root为根的二叉排序树中删除关键字值为 x 的结点,成功返回true,失败返回false
  BSTNode *s,*p,*f;
  p=Search(root,x,f);//寻找删除结点
  if(p==NULL) return false;//查找失败,不作删除
  if(p->lchild!=NULL&&p->rchild!=NULL)
  {
    s=p->lchild;//找 p 的中序前驱 s
    while(s->rchild!=NULL)
    {
     f=s;
     s=s->rchild;
    }
    p->data=s->data;
    p=s;
  }
  if(p->lchild!=NULL)
    s=p->lchild;//记录非空子女结点
  else
    s=p->rchild;
  if(p==root) root=s;//被删结点为根结点
   else if(s->data<f->data)
          f->lchild=s;
        else
          f->rchild=s;
  free(p);//释放被删结点
  return true;
}
void InsertSort(DataType l[],int left,int right)
{//直接插入排序
  DataType temp;
  int i,j;
  for(i=left+1;i<right;i++)
     if(l[i]<l[i-1])
     {
       temp=l[i];
       j=i-1;
       do{
          l[j+1]=l[j];
          j--;
         }while(j>=left&&temp<l[j]);
       l[j+1]=temp;
     }
}
 
void BinaryInsertSort(DataType l[],int left,int right)
{//折半插入排序
  DataType temp;
  int i,j,low,high,middle;
  for(i=left+1;i<=right;i++)
  {
    temp=l[i];
    low=left;
    hight=i-1;
    while(low<=high)
    {
      middle=(low+hight)/2;
      if(temp<l[middle])
        high=middle-1;
      else
        low=middle+1;
    }
  for(j=i-1;j>=low;j--)
     l[j+1]=l[j];
  l[low]=temp;
  }
}
 
void ShellSort(DataType l[],int left,int right)
{//希尔排序
  DataType temp;
  int i,j,gap=right-left+1;
  do{
    gap=gap/3+1;
    for(i=left+gap;i<=right;i++)
       if(l[i]<l[i-gap])
         {
          temp=l[i];
          j=i-gap;
          do{
             l[j+gap]=l[j];
             j=j-gap;
            }while(j>left&&temp<l[j]);
          l[j+gap]=temp;
         }
     }while(gap>1);
}
 
void BubbleSort(DataType l[],int left,int right)
{//气泡排序
  bool exchangel;
  DataType temp;
  int i,j;
  for(i=left;i<right;i++)
   {
     exchange=false;
     for(j=right;j>=i+1;j--)
      if(l[j-1]>l[j])
      {
        temp=l[j-1];
        l[j-1]=l[j];
        l[j]=temp;
        exchange=true;
      }
   if(exchange==false)return;
   }
}
 
void QuickSort(DataType l[],int left,int right)
{//快速排序
  if(left<right)
  {
    int pivotpos=Partition(left,right);
    QuickSort(l,left,pivotpos-1);
    QuickSort(l,pivotpos+1,right);
  }
}
int Partition(DataType l[],int low,int high)
{
  int l=low,j=high;
  DataType pivot=l[low];
  while(i<j)
   {
     while(i<j&&l[j]>=pivot) j--;
     if(i<j) l[i++]=l[j];
     while(i<j&&l[i]<=pivot) i++;
     if(i<j) l[j--]=l[i];
   }
  l[i]=pivot;
  return i;
}
 
void SelectSort(DataType l[],int left,int right)
{//选择排序
  DataType temp;
  int i,j,k;
  for(i=left;i<right;i++)
  {
    k=i;
    for(j=i+1;i<right;i++)
      if(l[j]<l[k]) k=j;
    if(k!=i)
    {
     temp=l[i];
     l[i]=l[k];
     l[k]=temp;
    }
  }
}
 
void Merge(DataType l1[],DataType l2[],int left,int mid,int right)
{
  for(int k=left;k<=right;k++)
      l2[k]=l1[k];
  int s1=left,s2=mid+1,t=left;
  while(s1<=mid&&s2<=right)
      if(l2[s1]<=l2[s2]) l1[t++]=l2[s1++];
      else
         l1[t++]=l2[s2++];
  while(s1<=mid) l1[t++]=l2[s1++];
  while(s2<=right)l1[t++]=l2[s2++];
}
 
int Width(BinTree bt)
{//用层次遍历求最大宽度
 if(bt==NULL) return 0;
 Queue Q;
 front=rear=last=1;
 temp=maxw=0;
 Q[rear]=bt;
 while(front<=last)
 {
   p=Q[front++];
   temp++;
   if(p->lchild!=NULL)
     Q[++rear]=p->lchild;
   if(p->rchild!=NULL)
     Q[++rear]=p->rchild;
   if(front>last)
   {
    last=rear;
    if(temp>maxw)
      maxw=temp;
    temp=0;
   }
 }
}
 
int JudgeComplete(BinTree bt)
{//判断完全二叉树
  int tag=0;
  BinTree p=bt;
  Queue Q;
  if(p==NULL)
    return 1;
  Enqueue(Q,P);
  while(!QueueEmpty(Q))
   {
    p=Dequeue(Q);
    if(p->lchild&&!tag)
      Enqueue(Q,p->lchild);
    else  if(p->lchild)
           return 0;
     else
         tag=1;
     if(p->rchild&&!tag)
       Enqueue(Q,p->rchild);
     else if(p->rchild)
           return 0;
          else
             tag=1;
    
   }
  return 1;
}
 
void BFST Traversec(Graph G)
{//广度优先遍历图
  for(v=0;v<G.vexnum;++v)
     visited[v]=false;
  InitQueue(Q);
  for(v=0;v<G.vexnum;++v)
  {
    if(!visited[v])
    {
      visited[v]=true;
         visit(v);
      Enqueue(Q,v);
      while(!QueueEmpty(Q))
      {
        Dequeue(Q,u);
        for(w=FirstAdjvex(G,u);w;w=NextAdjvex(G,u,w))
        {
          if(!visited[w])
          {
           visited[w]=true;
           visit(w);
           Enqueue(Q,w);
          }
        }
      }
    }
  }
}
 
void DFSTraverse(Gruph G)
{//图的深度优先遍历
  for(v=0;v<G.vexnum;v++)
     visited[v]=false;
  for(v=0;v<G.vexnum;++v)
  {
   if(!visited[v])
     DFS(G,v);
  }
}
void DFS(Graph G,int v)
{
 visited[v]=true;
 visit(v);
 for(w<FirstAdjvex(G,v);w;w=NextAdjvex(G,v,w))
 {
  if(!visited[w])
     DFS(G,w);
 }
}
或者
void DFS(Graph &G,int v,bool visited[])
{
 visit(getValue(g,v));
 visited[v]=true;
 int w=getFirstNeighbor(G,v);
 while(w!=-1)
 {
  if(visited[w]==false)
    DFS(G,w,visited);
  w=getNextNeighbor(G,v,w);
 }
}
 
status InOrderThreading(BinThrTree &Thrt,BinThrTree T)
{
 //中序遍历二叉树T,并将其中序线索化,Thrt指向头节点
 if(!(Thrt=(BinThrTree)malloc(sizeof(BinThrNode))))
    exit(OVERFLOW);
 Thrt->ltag=link;
 Thrt->rtag=Thread;
 Thrt->rchild=Thrt;
 if(!T)
    Thrt->lchild=Thrt;
 else
    {
     Thrt->lchild=T;
     pre=Thrt;
     InThreading(T);
     pre->rchild=Thrt;
     pre->rtag=Thread;
     Thrt->rchild=pre;
    }
   return OK;
}
void InThreading(BinThrTree p)
{
 if(p)
 {
   InThreading(p->lchild);
   if(!p->lchild)
   {
    p->ltag=Thread;
    p->lchild=pre;
   }
 if(!pre->rchild)
 {
  pre->rtag=Thread;
  p->rchild=p;
 }
 pre=p;
 InThreading(p->rchild);
 }
}
 
status InOrder-Thr(BinThrTree T,status(*visit)(ElemType e))
{//中序遍历线索二叉树
 p=T->lchild;
 while(p!=T)
 {
  while(p>ltag==link)
  {
    p=p->lchild;
  }
  if(!(visit(p->data)))
    return ERROR;
  while(p->rtag==Thread&&p->rchild!=T)
  {
    p=p->rchlid;
    visit(p->data);
  }
 p=p->rchild;
 }
}
 
int depth(BinTree T)
{//求二叉树的深度
  if(T==NULL)
   return 0;
  else
   {
    if((ldepth=depth(t.lchild))>(rdepth=depth(T.rchild)))
        return ldepth+1;
    else
        return rdepth+1;
   }
}
 
void LevelOrder(BinTree T)
{//二叉树层次遍历
  Queue Q;
  BinTree bt;
  if(T!=NULL)
  {
    visit(T);
    if(T->lchild!=NULL)
     Enqueue(Q,T->lchild);
    if(T->rchild!=NULL)
     Enqueue(Q,T->rchild);
  }
  bt=Dequeue(Q);
  LevelOrder(bt);
}
 
//利用两个栈S1,S2模拟队列
status Enqueue(stack S1,ElemType e)
{
  if(top1==n&&!Sempty(S2))
  {
    printf("栈满");
    return ERROR;
  }
  if(top1==n&&Sempty(S2))
  {
   while(!Sempty(S1))
   {
    pop(S1,e);
    push(S2,e);
   }
  }
 push(S1,e);
 return OK;
}
void Dequeue(stack S1,stack S2)
{
 if(!Sempty(S2))
 {
  pop(S2,e);
  printt("出队元素为:",e);
 }
 else
 {
   if(Sempty(S1))
   {
   printf(""队列空");
   exit(0);
   }
   else
      {
      while(!Sempty(S1))
       {
        pop(S1,e);
        push(S2,e);
       }
      pop(S2,e);
      printf("出队列元素为:",e);
      }
 }
}
 
int size(BinTreeNode *t)
{//求二叉树节点个数
  if(t==NULL) return 0;
  return 1+size(t->lchild)+size(t->rchild);
}
int leaves(BinTreeNode *t)
{//返回二叉树的叶子节点个数
 if(t==NULL) return 0;
 if(t->lchild==NULL&&t->rchild==NULL) return 1;
 return leaves(t->lchild)+leaves(t->rchild);
}
int height(BinTree *t)
{//返回二叉树的高度
 if(t==NULL) return 0;
 int hl=height(t->lchild);
 int hr=height(t->rchild);
 if(hl>hr) return hl+1;
  else return hr+1;
}
int level(BinTreeNode* t,BinTreeNode* p)
{//返回以*t为根的二叉树中指定节点*p所在层次
  if(t==NULL) return 0;
  if(t==p) return 1;
  int levell=level(t->lchild,p);
  if(level>0) return 1+levell;
  int levelr=level(t->rchlild,p);
  if(levelr>0) return 1+levelr;
return 0;
}
void reflect(BinTreeNode *t)
{//交换以为*t根的二叉树中每一个节点的两个子女
  if(t==NULL) return;
  reflect(t->lchild);
  reflect(t->rchild);
  BinTreeNode *P=t->lchild;
  t->lchild=t->rchild;
  t->rchild=p;
}
void defoliate(BinTreeNode *t)
{//从以*t为根的二叉树中删去所有叶子节点
  if(t==NULL) return;
  if(t->lchild==NULL&&t->rchild==NULL)
  {
    delete t;
    t=NULL;
  }
  else
  {
    defoliate(t->lchild);
    defoliate(t->rchild);
  }
}
int Degree1(BinTreeNode *t)
{//统计以*t为节点的二叉树中度为1的节点个数,有此可推出求度数为2的节点个数
  if(t==NULL) return 0;
  if(t->lchild!=NULL&&t->rchild==NULL||t->rchild!=NULL&&t->lchild==NULL)
    return 1+Degree1(t->lchild)+Degree1(t->rchild);
}
//统计以*t为根的二叉树的宽度:先用前序遍历求出每一层的宽度,再求最大宽度
int levelNumber(BinTreeNode *t,int a[],int level)
{
  if(t!=NULL)
  {
    a[level]+=1;
    levelNumber(t->lchild,a,level+1);
    levelNumber(t->rchild,a,level+1);
  }
}
int width(BinTreeNode *t)
{
  int a[n+1],level=0,i,wid;
  for(i=0;i<=n;i++)  a[i]=0;
  levelNumber(t,a,level);
  wid=a[0];
  for(i=1;i<=n;i++)
     if(a[i]>wid) wid=a[i];
  return wid;
}
DataType MaxValue(BinTree *t,DataType max)
{//计算以*t为根的二叉树节点中最大元素的值
  if(t!=NULL)
  {
   if(t->data>max) max=t->data;
   max=MaxValue(t->lchild,max);
   max=MaxValue(t->rchild,max);
  }
 return max;
}
void nodePrint(BinTreeNode *t,int i)
{//以前序输出一棵以为根的二叉树所有节点,数据值以及所在层次
  if(t!=NULL)
  {
    cout<<t->data<<","<<i<<endl;
    nodePrint(t->lchild,i+1);
    nodePrint(t->rchild,i+1);
  }
}
void ConstructTree(DataType T[],int n,int i,BinTreeNode *ptr)
{//一棵完全二叉树存在一个一维数组T[n]中,建立一棵链接二叉树与之对应
  if(i>=n) ptr=NULL;
  else
  {
    ptr=(BinTreeNode *)malloc(sizeof(BinTreeNode));
    ptr->data=T[i];
    ConstructTree(T,n,i*2+1,ptr->lchild);
    ConstructTree(T,n,i*2+2,ptr->rchild);
  }
}

oid InOrder(BinTree bt)
{ //二叉树链接实现,非递归中序遍历
  Stack S;
  p=bt;
  while(p!=NULL||!isEmpty(S));
  {
    while(p!=NULL)
    {
      push(S,p);
      p=p->lchild;
    }
    if(!isEmpty(S))
    {
     pop(S,p);
     Visit(p->data);
     p=p->rchild;
    }
  }
}
bool Insert(BSTree &root,DataType x)
{//二叉排序树非递归插入算法
  BSTNode *s,*p,*f;
  p=Search(root,x,f);//f指向查找节点父节点
  if(p!=NULL) return false;
  s=(BSTNode*)malloc(sizeof(BSTNode));
  if(s==NULL) return false;
  s->data=x;
  s->lchild=NULL;
  s->rchild=NULL;
  if(f==NULL)
    root=s;
  else if(x<f->data)
         f->lchild=s;
       else
          f->rchild=s;
 return true;
}
bool Remove(BSTree &root,DataType x)
{//二叉排序树的非递归删除算法
  BSTNode *s,*p,*f;
  p=Search(root,x,f);
  if(p==NULL) return false;
  if(p->lchild!=NULL&&p->rchild!=NULL)
  {
    s=p->lchild;
    while(s->rchild!=NULL)
    {
     f=s;
     s=s->rchild;
    }
    p->data=s->data;
    p=s;
  }
  if(p->lchild!=NULL)
    s=p->lchild;
  else
    s=p->rchild;
  if(p==root) root=s;
   else if(s->data<f->data)
          f->lchild=s;
        else
          f->rchild=s;
  free(p);
  return true;
}
 
Prim算法(求最小生成树)
const int MaxInt=INT_MAX;
const int n=6;
typedef int AdjMatrix[n][n];
typedef struct{
        int fromVex,toVex;
        int weight;
        };
typedef TreeEdgeNode MST[n-1];
void PrimMST(AdjMatrix G,MST T,int rt)
{//从顶点rt出发构造G的最小生成树T,rt为根
 TreeEdgeNode e;
 int i,k=0,min,minpos,v;
 for(i=0;i<n;i++)
 {
   if(i!=rt)
   {
     T[k].fromVex=rt;
     T[k].toVex=i;
     T[k++].weight=G[rt][i];
   }
 }
 for(k=0;k<n-1;k++)
 {
   min=MaxInt;
   for(i=k;i<n-1;i++)
   {
    if(T[i].weight<min)
    {
     min=T[i].weight;
     minpos=i;
    }
   }
  if(min==MaxInt)
  {
    cout<<"Graph is disconnected!"<<endl;
      exit(0);
  }
 e=T[minpos];
 T[minpos]=T[k];
 T[k]=e;
 v=T[k].toVex;
 for(i=k+1;i<n-1;i++)
 {
  if(G[v][T[i].toVex]<T[i].weight)
  {
   T[i].weight=G[v][T[i].toVex];
   T[i].fromVex=v;
  }
 }
 }
}
 
拓扑排序
void topsort(hdnodes graph[],int n)
{
  int i,j,k,topl;
  node_pointer ptr;
  top=-1;
  for(i=0;i<n;i++)
  {
    if(!graph[i].count)
    {
      graph[i].count=top;
      top=i;
    }
  }
 for(i=0;i<n;i++)
 {
   if(top==-1)
   {
     fprintf(stderr,"\\n graph has a cycle!\\n");
      exit(1);
   }
   else{
        j=top;
        top=-1;
        printf("v%d",j);
        for(ptr=graph.link;ptr;ptr=ptr->link)
     



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值