码迷,mamicode.com
首页 > 其他好文 > 详细

3.1 层次关系结构:树(1)

时间:2016-07-19 09:19:31      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

3-1 BinTree.c

  1 #include <stdio.h> 
  2 #include <stdlib.h> 
  3 #define QUEUE_MAXSIZE 50
  4 typedef char DATA;       //定义元素类型 
  5 typedef struct ChainTree  //定义二叉树结点类型 
  6 {
  7     DATA data;    //元素数据
  8     struct ChainTree *left;    //左子树结点指针
  9     struct ChainTree *right;    //右子树结点指针
 10 }ChainBinTree;
 11 ChainBinTree *BinTreeInit(ChainBinTree *node) //初始化二叉树根结点 
 12 {
 13      if(node!=NULL) //若二叉树根结点不为空 
 14          return node;
 15      else
 16          return NULL;
 17 }
 18 int BinTreeAddNode(ChainBinTree *bt,ChainBinTree *node,int n) //添加数据到二叉树 
 19 //bt为父结点,node为子结点,n=1表示添加左子树,n=2表示添加右子树 
 20 {
 21     if(bt==NULL)
 22     {
 23         printf("父结点不存在,请先设置父结点!\n");
 24         return 0;
 25     } 
 26     switch(n)
 27     {
 28         case 1: //添加到左结点 
 29             if(bt->left) //左子树不为空 
 30             {
 31                 printf("左子树结点不为空!\n");
 32                 return 0;
 33             }else
 34                 bt->left=node;
 35             break;
 36         case 2://添加到右结点
 37             if( bt->right) //右子树不为空 
 38             {
 39                 printf("右子树结点不为空!\n"); 
 40                 return 0;
 41             }else
 42                 bt->right=node;
 43             break;
 44         default:
 45             printf("参数错误!\n");
 46             return 0;
 47     }
 48     return 1;
 49 }
 50 ChainBinTree *BinTreeLeft(ChainBinTree *bt) //返回左子结点 
 51 {
 52     if(bt)
 53         return bt->left;
 54     else
 55         return NULL;
 56 }
 57 ChainBinTree *BinTreeRight(ChainBinTree *bt) //返回右子结点 
 58 {
 59     if(bt)
 60         return bt->right;
 61     else
 62         return NULL;
 63 }
 64 int BinTreeIsEmpty(ChainBinTree *bt) //检查二叉树是否为空,为空则返回1,否则返回0 
 65 {
 66     if(bt)
 67         return 0;
 68     else
 69         return 1;
 70 } 
 71 int BinTreeDepth(ChainBinTree *bt) //求二叉树深度
 72 {
 73     int dep1,dep2;
 74     if(bt==NULL)
 75         return 0; //对于空树,深度为0
 76     else
 77     {
 78         dep1 = BinTreeDepth(bt->left); //左子树深度 (递归调用)
 79         dep2 = BinTreeDepth(bt->right); //右子树深度 (递归调用)
 80         if(dep1>dep2)
 81            return dep1 + 1; 
 82         else
 83             return dep2 + 1; 
 84     } 
 85 } 
 86 ChainBinTree *BinTreeFind(ChainBinTree *bt,DATA data) //在二叉树中查找值为data的结点 
 87 {
 88     ChainBinTree *p;
 89     if(bt==NULL)
 90         return NULL;
 91     else
 92     {
 93         if(bt->data==data)
 94             return bt; 
 95         else{ // 分别向左右子树递归查找 
 96             if(p=BinTreeFind(bt->left,data))
 97                 return p;
 98             else if(p=BinTreeFind(bt->right, data)) 
 99                 return p;
100             else
101                 return NULL; 
102         } 
103     } 
104 } 
105 void BinTreeClear(ChainBinTree *bt) // 清空二叉树,使之变为一棵空树
106 {
107      if(bt)
108      {
109          BinTreeClear(bt->left); //清空左子树 
110          BinTreeClear(bt->right);//清空右子树 
111          free(bt);//释放当前结点所占内存 
112          bt=NULL;
113      }
114      return; 
115 }
116 void BinTree_DLR(ChainBinTree *bt,void (*oper)(ChainBinTree *p))  //先序遍历 
117 {     
118      if(bt)//树不为空,则执行如下操作 
119      {
120          oper(bt); //处理结点的数据 
121          BinTree_DLR(bt->left,oper);
122          BinTree_DLR(bt->right,oper);
123      }
124      return; 
125 } 
126 void BinTree_LDR(ChainBinTree *bt,void(*oper)(ChainBinTree *p))  //中序遍历 
127 {
128      if(bt)//树不为空,则执行如下操作 
129      {
130          BinTree_LDR(bt->left,oper); //中序遍历左子树
131          oper(bt);//处理结点数据 
132          BinTree_LDR(bt->right,oper); //中序遍历右子树/
133      }
134      return; 
135 } 
136 void BinTree_LRD(ChainBinTree *bt,void (*oper)(ChainBinTree *p)) //后序遍历
137 {
138      if(bt)
139      {
140          BinTree_LRD(bt->left,oper); //后序遍历左子树 
141          BinTree_LRD(bt->right,oper); //后序遍历右子树/
142          oper(bt); //处理结点数据
143      }
144      return; 
145 }
146 
147 void oper(ChainBinTree *p) //操作二叉树结点数据 
148 {
149      printf("%c ",p->data); //输出数据
150      return;
151 }
152 
153 void BinTree_Level(ChainBinTree *bt,void (*oper)(ChainBinTree *p)) //按层遍历 
154 {
155      ChainBinTree *p;
156      ChainBinTree *q[QUEUE_MAXSIZE]; //定义一个顺序栈 
157      int head=0,tail=0;//队首、队尾序号 
158      if(bt)//若队首指针不为空     
159      {
160          tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列队尾序号 
161          q[tail] = bt;//将二叉树根指针进队
162      }
163      while(head!=tail) //队列不为空,进行循环 
164      {
165          head=(head+1)%QUEUE_MAXSIZE; //计算循环队列的队首序号 
166          p=q[head]; //获取队首元素 
167          oper(p);//处理队首元素 
168          if(p->left!=NULL) //若结点存在左子树,则左子树指针进队 
169          {
170              tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列的队尾序号 
171              q[tail]=p->left;//将左子树指针进队 
172          }
173                  
174          if(p->right!=NULL)//若结点存在右孩子,则右孩子结点指针进队 
175          {
176              tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列的队尾序号 
177              q[tail]=p->right;//将右子树指针进队 
178          }
179      }
180      return; 
181 }

3-2 BinTreeTest.c

  1 #include <stdio.h> 
  2 #include "3-1 BinTree.c"
  3 void oper(ChainBinTree *p) //操作二叉树结点数据 
  4 {
  5      printf("%c ",p->data); //输出数据
  6      return;
  7 }
  8 ChainBinTree *InitRoot()  //初始化二叉树的根 
  9 {
 10     ChainBinTree *node;
 11     if(node=(ChainBinTree *)malloc(sizeof(ChainBinTree))) //分配内存
 12     {
 13         printf("\n输入根结点数据:");
 14         scanf("%s",&node->data);
 15         node->left=NULL;
 16         node->right=NULL;
 17         return BinTreeInit(node);
 18     }
 19     return NULL;
 20 }
 21 void AddNode(ChainBinTree *bt)
 22 {
 23      ChainBinTree *node,*parent;
 24      DATA data;
 25      char select;
 26     if(node=(ChainBinTree *)malloc(sizeof(ChainBinTree))) //分配内存
 27     {
 28         printf("\n输入二叉树结点数据:");
 29         fflush(stdin);//清空输入缓冲区 
 30         scanf("%s",&node->data);
 31         node->left=NULL; //设置左右子树为空 
 32         node->right=NULL;
 33         
 34 
 35         printf("输入父结点数据:");
 36         fflush(stdin);//清空输入缓冲区 
 37         scanf("%s",&data);
 38         parent=BinTreeFind(bt,data);//查找指定数据的结点 
 39         if(!parent)//若未找到指定数据的结点 
 40         {
 41             printf("未找到父结点!\n");
 42             free(node); //释放创建的结点内存 
 43             return;
 44          }
 45          printf("1.添加到左子树\n2.添加到右子树\n");
 46          do{
 47             select=getch();
 48             select-=0;
 49             if(select==1 || select==2)
 50                 BinTreeAddNode(parent,node,select); //添加结点到二叉树 
 51          }while(select!=1 && select!=2);
 52     }
 53     return ;
 54 }
 55 int main() 
 56 {
 57     ChainBinTree *root=NULL; //root为指向二叉树根结点的指针 
 58     char select;
 59     void (*oper1)(); //指向函数的指针 
 60     oper1=oper; //指向具体操作的函数 
 61     do{
 62         printf("\n1.设置二叉树根元素    2.添加二叉树结点\n");
 63         printf("3.先序遍历            4.中序遍历\n");
 64         printf("5.后序遍历            6.按层遍历\n");
 65         printf("7.二叉树深度          0.退出\n");
 66         select=getch();
 67         switch(select){
 68         case 1: //设置根元素 
 69              root=InitRoot();
 70              break;
 71         case 2: //添加结点 
 72              AddNode(root);
 73              break;
 74         case 3://先序遍历
 75              printf("\n先序遍历的结果:");
 76              BinTree_DLR(root,oper1);
 77              printf("\n");
 78              break;
 79         case 4://中序遍历 
 80              printf("\n中序遍历的结果:");
 81              BinTree_LDR(root,oper1);
 82              printf("\n");
 83              break;
 84         case 5://后序遍历 
 85              printf("\n后序遍历的结果:");
 86              BinTree_LRD(root,oper1);
 87              printf("\n");
 88              break;
 89         case 6://按层遍历
 90              printf("\n按层遍历的结果:");
 91              BinTree_Level(root,oper1);
 92              printf("\n");
 93              break;
 94         case 7://二叉树的深度
 95             printf("\n二叉树深度为:%d\n",BinTreeDepth(root));
 96             break; 
 97         case 0:
 98              break;
 99         }
100     }while(select!=0);
101     BinTreeClear(root);//清空二叉树 
102     root=NULL;
103     getch();
104     return 0;
105 }

 

3.1 层次关系结构:树(1)

标签:

原文地址:http://www.cnblogs.com/wozixiaoyao/p/5683125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!