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

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 }
时间: 2024-07-30 06:09:32

3.1 层次关系结构:树(1)的相关文章

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

3.3 c 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define QUEUE_MAXSIZE 50 4 typedef char DATA; //定义元素类型 5 typedef enum 6 { 7 SubTree, 8 Thread 9 }NodeFlag; //枚举值SubTree(子树)和Thread(线索)分别为0,1 10 typedef struct ThreadTree //定义线索二叉树结点类型 11 { 12

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

3-5 HuffmanTree.c 1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <string.h> 4 typedef struct 5 { 6 int weight; //权值 7 int parent; //父结点序号 8 int left; //左子树序号 9 int right; //右子树序号 10 }HuffmanTree; 11 typedef char *HuffmanCode; //Hu

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

5、层次关系访问节点和创建节点

层次关系访问节点和创建节点 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta htt

JDK中ClassLoader的分类以及ClassLoader间的层次关系

几个常见的ClassLoader: bootstrap  class  loader: 最早启动的class  loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的.这个class  loader你动不了,也没有名字,打印出来是空值. 1,负责先把其他的class loader   load进来,然后其他class  loader再load其他class 2,load  jre最核心的类,最核心的rt.jar拿出来把里边的class load进来. extension

Java输入、输入、IO流 类层次关系梳理

Java输入.输入.IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958.htm?noadapt=1 http://blog.csdn.net/hguisu/article/details/7418161 https://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http:/

通过节点层次关系获取节点

<!--通过节点的层次关系获取节点对象. 关系:1.父节点:parentNode:对应一个节点对象.2.子节点:childNodes:对应一个节点集合.3.兄弟节点: 上一个兄弟节点:parviousSibling下一个兄弟节点:nextSibling--> <script type="text/javascript"> function getNodeByLevel(){ //获取页面中的表格节点var tabNode = document.getElemen

一张图让你清晰 UIViewController,UINavigationController和 UITabBarController的层次关系

在学习多视图控制器的时候,曾经有一个问题一直困扰着我,就是给标签栏title赋值的问题. 就常用的层次关系来说,一个标签栏视图 里面 套 一个 导航视图 ,导航视图 里 套 我们展示内容 的 内容视图 . UITabBarController->UINavigationController->UIViewController UITabBarController和UINavigationController 都继承自UIViewController UIViewControlleller  的

JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)

利用节点间的层次关系获取节点: 上一节讲了3中获取的方式: * ※※一.绝对获取,获取元素的3种方式:-Element * 1.getElementById(): 通过标签中的id属性值获来取该标签对象 * 2.getElementsByName(): 通过标签中的name属性值来获取该标签对象集合 * 3.getElementsByTagName(): 通过标签名来获取该标签对象集合 现在来看看相对获取的方式: ※※二.相对获取(利用节点之间的层次关系),获取节点:-Node 1.父节点:pa