平衡二叉树

来源:互联网 发布:淘宝定义管制刀具定义 编辑:程序博客网 时间:2024/06/06 22:23

程序输入一个字符串(只包含小写字母),请按照字符的输入顺序建立平衡二叉排序树,并分别输出二叉树的先序序列、中序序列和后序序列,最后输出该二叉树向左旋转 90 度后的结构。

例如:向左旋转 90 度后,以每层向里缩进 4 个空格的方式输出,输出结果为:

        i
    g
        f
a
        d
    c
        b

输入:agxnzyimk

输出:
Preorder: xigamknzy
Inorder: agikmnxyz
Postorder: agknmiyzx
Tree:
    z
        y
x
            n
        m
            k
    i
        g

            a

测试输出

agxnzyimk

测试输出

Preorder: xigamknzyInorder: agikmnxyzPostorder: agknmiyzxTree:    z        yx            n        m            k    i        g            a

源代码

#include<stdio.h>  #include<stdlib.h>  #include<string.h>   #define MAXSIZE 1000    typedef struct node{      int bf;      char data;      struct node *lchild,*rchild;   /*左右指针*/   }AVLTNode,* AVLTree;    void  ins_AVLtree(AVLTree  *avlt ,  char  K)  /*在平衡二叉树中插入元素k,使之成为一棵新的平衡二叉排序树*/  {      AVLTNode *S;      AVLTNode *A, *FA, *p, *fp, *B, *C;      S=(AVLTree)malloc(sizeof(AVLTNode));      S->data=K;       S->lchild=S->rchild=NULL;      S->bf=0;      if (*avlt==NULL)            *avlt=S;      else       {       /* 首先查找S的插入位置fp,同时记录距S的插入位置最近且平衡因子不等于0(等于-1或1)的结点A,A为可能的失衡结点*/          A=*avlt;  FA=NULL;          p=*avlt;  fp=NULL;          while  (p!=NULL)          {               if (p->bf!=0)               {                  A=p; FA =fp;              }              fp=p;              if  (K < p->data)                    p=p->lchild;              else                    p=p->rchild;          }          /* 插入S*/          if (K < fp->data)               fp->lchild=S;          else              fp->rchild=S;          /* 确定结点B,并修改A的平衡因子 */          if (K < A->data)          {              B=A->lchild;              A->bf=A->bf+1;          }          else          {              B=A->rchild;              A->bf=A->bf-1;          }          /* 修改B到S路径上各结点的平衡因子(原值均为0)*/          p=B;          while (p!=S)          {              if  (K < p->data)              {                  p->bf=1;                  p=p->lchild;              }              else              {                  p->bf=-1;                  p=p->rchild;              }              /* 判断失衡类型并做相应处理 */              if  (A->bf==2 && B->bf==1)       /* LL型 */              {                  B=A->lchild;                  A->lchild=B->rchild;                  B->rchild=A;                  A->bf=0;                  B->bf=0;                  if (FA==NULL)                       *avlt=B;                  else                       if (A==FA->lchild)                           FA->lchild=B;                      else                           FA->rchild=B;              }              else                  if (A->bf==2 && B->bf==-1)       /* LR型 */                  {                      B=A->lchild;                      C=B->rchild;                      B->rchild=C->lchild;                      A->lchild=C->rchild;                      C->lchild=B;                      C->rchild=A;                      if (S->data < C->data)                      {                           A->bf=-1;                          B->bf=0;                          C->bf=0;                      }                      else                           if (S->data >C->data)                          {                              A->bf=0;                              B->bf=1;                              C->bf=0;                          }                          else                          {                               A->bf=0;                              B->bf=0;                          }                          if  (FA==NULL)                               *avlt=C;                          else                               if (A==FA->lchild)                                   FA->lchild=C;                              else                                   FA->rchild=C;                  }                  else                       if  (A->bf==-2 && B->bf==1)       /* RL型 */                      {                          B=A->rchild;                          C=B->lchild;                          B->lchild=C->rchild;                          A->rchild=C->lchild;                          C->lchild=A;                          C->rchild=B;                          if (S->data <C->data)                           {                               A->bf=0;                              B->bf=-1;                              C->bf=0;                          }                          else                               if (S->data >C->data)                              {                                  A->bf=1;                                  B->bf=0;                                  C->bf=0;                              }                              else                               {                                   A->bf=0;                                  B->bf=0;                              }                              if (FA==NULL)                                    *avlt=C;                              else                                  if (A==FA->lchild)                                       FA->lchild=C;                                  else                                        FA->rchild=C;                      }                      else                           if (A->bf==-2 && B->bf==-1)       /* RR型 */                          {                              B=A->rchild;                              A->rchild=B->lchild;                              B->lchild=A;                              A->bf=0;                              B->bf=0;                              if (FA==NULL)                                   *avlt=B;                              else                                  if (A==FA->lchild)                                      FA->lchild=B;                                  else                                       FA->rchild=B;                          }                  }          }  }    AVLTree CreateAVLT(AVLTNode *valt)  /*从键盘输入元素的值,创建相应的二叉排序树*/   {      int i=0;      char str[MAXSIZE];      scanf("%s",str);      while(i<strlen(str)){          ins_AVLtree(&valt,str[i]);          i++;      }      return(valt);  }    void PreOrder(AVLTree root)   /*按先序输出节点*/   {                                    if(root!=NULL){          printf("%c",root->data);          PreOrder(root->lchild);          PreOrder(root->rchild);      }  }    void InOrder(AVLTree root)   /*按中序输出节点*/  {          if(root!=NULL){          InOrder(root->lchild);          printf("%c",root->data);          InOrder(root->rchild);      }  }    void PostOrder(AVLTree root)  /*按后续输出节点*/    {        if(root!=NULL){          PostOrder(root->lchild);          PostOrder(root->rchild);          printf("%c",root->data);      }  }    void PrintTree(AVLTree bt,int nLayer)  /*竖状输出二叉树*/  {         int i;      if(bt==NULL) return;      PrintTree(bt->rchild,nLayer+1);       for(i=0;i<nLayer;i++)           printf("    ");      printf("%c\n",bt->data);       PrintTree(bt->lchild,nLayer+1);  }    int main(){      AVLTree valt;      valt=NULL;      valt=CreateAVLT(valt);      printf("Preorder: ");      PreOrder(valt);      printf("\n");      printf("Inorder: ");      InOrder(valt);      printf("\n");      printf("Postorder: ");      PostOrder(valt);      printf("\n");      printf("Tree:\n");      PrintTree(valt,0);  }  


0 0
原创粉丝点击