首页 > 其他分享 >二叉树(周五实验)

二叉树(周五实验)

时间:2023-11-10 20:57:10浏览次数:40  
标签:node return data 周五 next 实验 StackNode QueueNode 二叉树

  1 #include <iostream>
  2 #include<fstream>
  3 using namespace std;
  4 
  5 typedef struct TreeNode
  6 {
  7     char data;
  8     int level;
  9     TreeNode* lchid;
 10     TreeNode* rchid;
 11 }TreeNode;
 12 
 13 char arr[20][2];//存放结点信息
 14 bool visited[20]={0};//标记是否访问
 15 int numlevel[20]={0};
 16 int sum=1;//文件总行数加一
 17 
 18 typedef struct StackNode
 19 {
 20     TreeNode* data;
 21     StackNode* next;
 22 }StackNode;
 23 
 24 typedef struct QueueNode
 25 {
 26     TreeNode* data;
 27     QueueNode* next;
 28     QueueNode* pre;
 29 }QueueNode;
 30 
 31 QueueNode* initQueue()
 32 {
 33     QueueNode* Q = (QueueNode*)malloc(sizeof(QueueNode));
 34     Q->data = NULL;
 35     Q->next = Q;
 36     Q->pre = Q;
 37     return Q;
 38 }
 39 
 40 void enQueue(QueueNode* Q,TreeNode*T)
 41 {
 42     QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));
 43     node->data = T;
 44     
 45     node->next = Q;
 46     node->pre = Q->pre;
 47     Q->pre->next = node;
 48     Q->pre = node;
 49 }
 50 
 51 bool isEmptyQ(QueueNode* Q)
 52 {
 53     if (Q->next == Q)
 54         return true;
 55     return false;
 56 }
 57 
 58 QueueNode* deQueue(QueueNode* Q)
 59 {
 60     if (isEmptyQ(Q) == true)
 61         return NULL;
 62     QueueNode* node = Q->next;
 63 
 64     Q->next->next->pre = Q;
 65     Q->next = Q->next->next;
 66     return node;
 67 }
 68 
 69 StackNode* initStack()
 70 {
 71     StackNode* S = (StackNode*)malloc(sizeof(StackNode));
 72     S->data = NULL;
 73     S->next = NULL;
 74     return S;
 75 }
 76 
 77 void Push(TreeNode* data, StackNode* S)
 78 {
 79     StackNode* node = (StackNode*)malloc(sizeof(StackNode));
 80     node->data = data;
 81     node->next = S->next;
 82     S->next = node;
 83 }
 84 
 85 int isEmptyS(StackNode* S)
 86 {
 87     if (S->next == NULL)
 88         return 1;
 89     return 0;
 90 }
 91 
 92 StackNode* Pop(StackNode* S)
 93 {
 94     if (isEmptyS(S))
 95         return NULL;
 96     StackNode* node = S->next;
 97     S->next = node->next;
 98     return node;
 99 }
100 
101 StackNode* GetPop(StackNode* S)
102 {
103     if (isEmptyS(S))
104         return NULL;
105     StackNode* node = S->next;
106     return node;
107 }
108 
109 int SearchChild(int place)
110 {
111     for (int i = 1; i < sum; i++)
112     {
113         //该节点未访问并且父亲等于搜索的结点
114         if (visited[i] == 0 && arr[i][2] == arr[place][1])
115             return i;
116     }
117     return -1;
118 }
119 
120 void CreateTreeNode(TreeNode** T,int place,int pos)
121 {
122     //没有该结点
123     if (place == -1)
124         (*T) = NULL;
125     else
126     {
127         visited[place] = 1;
128         //标记已经访问,防止多次访问
129 
130         char ch = arr[place][1];
131         (*T) = (TreeNode*)malloc(sizeof(TreeNode));
132         (*T)->data = ch;
133         (*T)->level = pos;
134 
135         pos++;
136 
137         //寻找左孩子
138         int nextplace1 = SearchChild(place);
139         CreateTreeNode(&(*T)->lchid, nextplace1,pos);
140         //寻找右孩子
141         int nextplace2 = SearchChild(place);
142         CreateTreeNode(&(*T)->rchid, nextplace2,pos);
143     }
144     
145 }
146 
147 //先序遍历(递归)
148 void preOrderFun(TreeNode* T)
149 {
150     if (T == NULL)
151         return;
152     else
153     {
154         //输出节点
155         cout << T->data << " ";
156         //左孩子
157         preOrderFun(T->lchid);
158         //右孩子
159         preOrderFun(T->rchid);
160     }
161 }
162 
163 //中序遍历非递归
164 void inOrder(TreeNode* T)
165 {
166     TreeNode* node = T;
167     StackNode* S = initStack();
168     while (node||!isEmptyS(S))
169     {
170         if (node)
171         {
172             Push(node, S);
173             node = node->lchid;
174         }
175         else
176         {
177             node = Pop(S)->data;
178             cout << node->data << " ";
179             node = node->rchid;
180         }
181     }
182 }
183 
184 void LevelNumber(TreeNode* T,QueueNode*Q)
185 {
186     enQueue(Q, T);
187     while (!isEmptyQ(Q))
188     {
189         QueueNode* node = deQueue(Q);
190         numlevel[node->data->level]++;
191         if (node->data->lchid)
192             enQueue( Q,node->data->lchid);
193         if (node->data->rchid)
194             enQueue(Q, node->data->rchid);
195     }
196 }
197 
198 int main()
199 {
200     fstream fp;
201     fp.open("text.txt", ios::in);
202     if (!fp)return 0;
203 
204     int place = 0;//找寻根节点
205     while (!fp.eof())
206     {
207         fp >> arr[sum][1] >> arr[sum][2];
208         if (arr[sum][1] == arr[sum][2]&&arr[sum][1]!='\0')
209             place = sum;
210         sum++;
211     }
212 
213     int pos = 1;//层次
214 
215     TreeNode* T;
216     CreateTreeNode(&T, place,pos);
217 
218     cout << "先序遍历:" << endl;
219     preOrderFun(T);
220     cout << endl;
221 
222     cout << "中序遍历:" << endl;
223     inOrder(T);
224     cout << endl;
225 
226     QueueNode* Q = initQueue();
227     LevelNumber(T,Q);
228     int i = 1;
229     while (numlevel[i] != 0)
230     {
231         cout << numlevel[i] << endl;
232         i++;
233     }
234 }

 

标签:node,return,data,周五,next,实验,StackNode,QueueNode,二叉树
From: https://www.cnblogs.com/saucerdish/p/17825025.html

相关文章

  • [左神面试指南] 二叉树[上]篇
    CDXXX用递归和非递归方式实现二叉树先序、中序和后序遍历❗publicclassCDbianli_1{publicstaticclassTreeNode{publicintval;publicTreeNodeleft;publicTreeNoderight;publicTreeNode(intnum){......
  • 面试必刷TOP101:24、二叉树的中序遍历
    题目题解深度优先搜索-递归publicclassSolution{/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@paramrootTreeNode类*@returnint整型一维数组*/publicint[]inorderTraversal(TreeNo......
  • 02_二叉树的迭代遍历
    二叉树的迭代遍历//前序遍历顺序:中-左-右,入栈顺序:中-右-左classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>result=newArrayList<>();if(root==null){returnresult;}St......
  • 【单片机】实验2:按下式开关控制小灯
    #include<REGX51.H>#include<intrins.h>//实验目标@萌狼蓝天/**1、SW1开关控制LED发光二极管左移流水2、SW2开关控制发光二极管右移流水3、由按键开关k1控制LED发光二极管奇偶交替闪烁4、由按键开关k2控制LED发光二极管亮灭闪烁*///接口与设备对应关系/* P1 : L......
  • 【腾讯云 HAI域探秘】借助HAI,轻松部署StableDiffusion环境拿捏AI作画-体验实验赢大奖
    【腾讯云HAI域探秘】借助HAI,轻松部署StableDiffusion环境拿捏AI作画-体验实验赢大奖爆火的Ai生图你体验到了吗?没有绘画能力、摄影能力也能随心所欲的创作出自己的作品!但是很多人因为高昂的硬件和繁琐的安装对它望而却步。腾讯云的高性能应用服务HAI(HyperApplicationInventor......
  • 大型数据库实验三
    实验三--熟悉常用的HBase操作1、列出HBase所有表的信息,例如表名2、在终端打印出指定的表的所有的就数据3、向已经创建好的表中添加或者删除指定的列族或列添加数据:删除数据:4、清空指定的表的所有的数据5、统计表的行数6、将下面的关系数据库,转换为合适的hbase格......
  • 实验:C SOCKET 多线程服务端链表分组实现聊天室
    目录......
  • 面试必刷TOP101:23、二叉树的前序遍历
    题目题解importjava.util.*;publicclassSolution{publicvoidpreorder(List<Integer>list,TreeNoderoot){//遇到空节点则返回if(root==null)return;//先遍历根节点list.add(root.val);//再去左子树......
  • 【Linux上机实验】新实验五 shell编程
    【前言】愿,所有相遇,都恰逢其时!愿,此刻心头,正满怀欣喜!---你好,朋友,欢迎你! ---对此篇博客中有任何问题和不懂的可以咨询QQ:27595909051.编写脚本,从键盘输入10个数,并计算这些数的和(用数组存放20个数)。1.输入visum.sh,创建一个名为"sum.sh"的文件......
  • 大型数据库实验1
    实验环境:linux,Hadoop3.3.0实验内容与完成情况:1.熟悉常用的Linux操作1)cd命令:切换目录(1) 切换到目录“/usr/local”(2) 切换到当前目录的上一级目录(3) 切换到当前登录Linux系统的用户的自己的主文件夹 2)ls命令:查看文件与目录查看目录“/usr”下的所有文件和目录 ......