根据广义表建立对应二叉树(子女兄弟链表表示)并由二叉树输出对应广义表(子女兄弟链表表示)的C++非递归实现

根据输入的广义表建立子女右兄弟链的二叉树表示,该二叉树对应于广义表对应的普通树。先考虑更复杂的情形,如果广义表中存在共享表,则将其转换为带共享子树的二叉树表示,每一共享子树带有附加头节点,其左链指针指向共享子树,最后输出带共享子树的子女右兄弟链表示(广义表形式)

C++代码:

  1 #include "stdafx.h"
  2 #include <iostream>
  3 #include <stack>
  4 #include <string>
  5 #include <map>
  6 #include <vector>
  7 using namespace std;
  8
  9 class Dnode   //二叉树节点类
 10 {
 11 public:
 12     char data;
 13     Dnode *left;
 14     Dnode *right;
 15     Dnode(char d = ‘\0‘) :data(d), left(nullptr), right(nullptr) {}
 16 };
 17
 18 class info
 19 {
 20 public:
 21     vector<int> left;
 22     vector<int> right;
 23     Dnode *share = nullptr;
 24     vector<int>::size_type position = 0;
 25 };
 26
 27 int Searchd(Dnode *ptr, int d);
 28 void creatsharelist(string &glist, map<string, info> &sharelist);
 29 map<string, info>::iterator Searchshare(int left, map<string, info> &sharelist);
 30
 31 int main()
 32 {
 33     cout << "请输入广义表字符串形式" << endl;
 34     string glist;
 35     cin >> glist;     //输入广义表
 36
 37     map<string, info> sharelist;
 38     creatsharelist(glist, sharelist);
 39
 40     stack<Dnode *> arrange;
 41     Dnode *ptr = nullptr;
 42
 43     map<string, info>::iterator p;
 44     for (string::size_type i = 0; i != glist.size(); i++)   //由广义表建子女右兄弟链二叉树
 45     {
 46         if (glist[i] == ‘(‘)
 47         {
 48             if (i == 0)
 49             {
 50                 ptr = new Dnode();
 51                 arrange.push(ptr);
 52             }
 53             else
 54             {
 55                 Dnode *temp = new Dnode();
 56                 if (arrange.top() == ptr)
 57                 {
 58                     if (arrange.size() != 1)
 59                     {
 60                         if (p != sharelist.end())
 61                         {
 62                             p->second.share = temp;
 63                         }
 64                     }
 65                      ptr->left=temp;
 66                 }
 67                 else
 68                 {
 69                     ptr->right = temp;
 70                 }
 71                 ptr = temp;
 72
 73                 if (glist[i + 1] != ‘)‘)
 74                 {
 75                     p = Searchshare(i + 1, sharelist);
 76                     if (p != sharelist.end())
 77                     {
 78                         if (p->second.share != nullptr)
 79                         {
 80                             i = p->second.right[p->second.position - 1] - 1;
 81                             temp->left = p->second.share;
 82                             continue;
 83                         }
 84                     }
 85                 }
 86                 arrange.push(ptr);
 87             }
 88         }
 89         else
 90         {
 91             if (glist[i] == ‘)‘)
 92             {
 93                 ptr = arrange.top();
 94                 arrange.pop();
 95             }
 96             else
 97             {
 98                 if (glist[i] != ‘,‘)
 99                 {
100                     Dnode *temp = new Dnode(glist[i]);
101                     if (ptr == arrange.top())
102                     {
103                         if (p != sharelist.end())
104                         {
105                             p->second.share = temp;
106                         }
107                         ptr->left = temp;
108                     }
109                     else
110                         ptr->right = temp;
111                     ptr = temp;
112                 }
113             }
114         }
115     }
116     //ptr指向二叉树根节点
117     cout << "已将广义表字符串形式转化为子女右兄弟链表示" << endl;
118     cout << "子女右兄弟链表示对应的广义表形式为:";
119     cout << "(";
120
121     int d = 0;
122     Dnode *const dest = ptr;
123     while (true)    //输出子女右兄弟链二叉树对应广义表形式
124     {
125         if (Searchd(ptr, d) == 0)
126         {
127             if (ptr == dest)
128             {
129                 if (d==0)
130                   cout << ‘)‘;
131                 break;
132             }
133             else
134             {
135                 if (d == 0)
136                 {
137                     if (ptr->data == ‘\0‘)
138                         cout << "()";
139                     else
140                         cout << ptr->data;
141                     cout << ")";
142                 }
143                 else
144                 {
145                     cout << ")";
146                 }
147                 ptr = arrange.top();
148                 d = 1;
149                 arrange.pop();
150             }
151         }
152         else
153         {
154             Dnode *interval = nullptr;
155             if (d == 0)
156             {
157                 if (ptr->left != nullptr)
158                 {
159                     if (ptr != dest)
160                         cout << "(";
161                     arrange.push(ptr);
162                     interval = ptr->left;
163                 }
164                 else
165                 {
166                     if (ptr->data == ‘\0‘)
167                     {
168                         cout << "()";
169                     }
170                     else
171                     {
172                         cout << ptr->data;
173                     }
174                     cout << ",";
175                     interval = ptr->right;
176                 }
177             }
178             else
179             {
180                 cout << ",";
181                 interval = ptr->right;
182             }
183             d = 0;
184             ptr = interval;
185         }
186     }
187     return 0;
188 }
189
190 int Searchd(Dnode *ptr, int d)
191 {
192     if (d == 2)
193         return 0;
194     else
195     {
196         if (d == 1)
197         {
198             if (ptr->right == nullptr)
199                 return 0;
200             else
201                 return 2;
202         }
203         else
204         {
205             if (ptr->left != nullptr)
206                 return 1;
207             else
208             {
209                 if (ptr->right != nullptr)
210                     return 2;
211                 else
212                     return 0;
213             }
214         }
215     }
216 }
217
218 void creatsharelist(string &glist, map<string, info> &sharelist)
219 {
220     vector<int> stack;
221     int total = 0;
222     for (const auto &s : glist)
223     {
224         if (s == ‘(‘)
225         {
226             ++total;
227             stack.push_back(total);
228         }
229         else if (s == ‘)‘)
230         {
231             ++total;
232             string temp = glist.substr(stack[stack.size() - 1] - 1, total - stack[stack.size() - 1] + 1);
233             auto p = sharelist.find(temp);
234             if (p == sharelist.end())
235             {
236                 auto q = sharelist.insert(make_pair(temp, *(new info)));
237                 q.first->second.left.push_back(stack[stack.size() - 1]);
238                 q.first->second.right.push_back(total);
239             }
240             else
241             {
242                 p->second.left.push_back(stack[stack.size() - 1]);
243                 p->second.right.push_back(total);
244             }
245             stack.pop_back();
246         }
247         else
248         {
249             ++total;
250         }
251     }
252
253     auto m = sharelist.begin();
254     while (m != sharelist.end())
255     {
256         if (m->second.left.size() == 1 || m->first=="()")
257             m = sharelist.erase(m);
258         else
259             ++m;
260     }
261 }
262
263 map<string, info>::iterator Searchshare(int left, map<string, info> &sharelist)
264 {
265     auto p = sharelist.begin();
266     for (; p != sharelist.end(); ++p)
267     {
268         if (p->second.left.size() != p->second.position && p->second.left[p->second.position] == left)
269         {
270             ++p->second.position;
271             return p;
272         }
273     }
274     return p;
275 }

运行结果:

广义表无共享表情形相对简单:

  1 #include "stdafx.h"
  2 #include <iostream>
  3 #include <stack>
  4 #include <string>
  5 using namespace std;
  6
  7 class Dnode
  8 {
  9 public:
 10     char data;
 11     Dnode *left;
 12     Dnode *right;
 13     Dnode(char d = ‘\0‘) :data(d), left(nullptr), right(nullptr) {}
 14 };
 15 int Searchd(Dnode *ptr, int d);
 16
 17 int main()
 18 {
 19     cout << "请输入广义表字符串形式" << endl;
 20     string glist;
 21     cin >> glist;
 22     stack<Dnode *> arrange;
 23     Dnode *ptr = nullptr;
 24
 25     for (string::size_type i = 0; i != glist.size(); i++)
 26     {
 27         if (glist[i] == ‘(‘)
 28         {
 29             if (i == 0)
 30             {
 31                 ptr = new Dnode();
 32                 arrange.push(ptr);
 33             }
 34             else
 35             {
 36                 Dnode *temp = new Dnode();
 37                 if (arrange.top() == ptr)
 38                 {
 39                      ptr->left=temp;
 40                 }
 41                 else
 42                 {
 43                     ptr->right = temp;
 44                 }
 45                 ptr = temp;
 46                 arrange.push(ptr);
 47             }
 48         }
 49         else
 50         {
 51             if (glist[i] == ‘)‘)
 52             {
 53                 ptr = arrange.top();
 54                 arrange.pop();
 55             }
 56             else
 57             {
 58                 if (glist[i] != ‘,‘)
 59                 {
 60                     Dnode *temp = new Dnode(glist[i]);
 61                     if (ptr == arrange.top())
 62                         ptr->left = temp;
 63                     else
 64                         ptr->right = temp;
 65                     ptr = temp;
 66                 }
 67             }
 68         }
 69     }
 70     //ptr指向二叉树根节点
 71     cout << "已将广义表字符串形式转化为子女右兄弟链表示" << endl;
 72     cout << "子女右兄弟链表示对应的广义表形式为:";
 73     cout << "(";
 74
 75     int d = 0;
 76     Dnode *const dest = ptr;
 77     while (true)
 78     {
 79         if (Searchd(ptr, d) == 0)
 80         {
 81             if (ptr == dest)
 82             {
 83                 if (d==0)
 84                   cout << ‘)‘;
 85                 break;
 86             }
 87             else
 88             {
 89                 if (d == 0)
 90                 {
 91                     if (ptr->data == ‘\0‘)
 92                         cout << "()";
 93                     else
 94                         cout << ptr->data;
 95                     cout << ")";
 96                 }
 97                 else
 98                 {
 99                     cout << ")";
100                 }
101                 ptr = arrange.top();
102                 d = 1;
103                 arrange.pop();
104             }
105         }
106         else
107         {
108             Dnode *interval = nullptr;
109             if (d == 0)
110             {
111                 if (ptr->left != nullptr)
112                 {
113                     if (ptr != dest)
114                         cout << "(";
115                     arrange.push(ptr);
116                     interval = ptr->left;
117                 }
118                 else
119                 {
120                     if (ptr->data == ‘\0‘)
121                     {
122                         cout << "()";
123                     }
124                     else
125                     {
126                         cout << ptr->data;
127                     }
128                     cout << ",";
129                     interval = ptr->right;
130                 }
131             }
132             else
133             {
134                 cout << ",";
135                 interval = ptr->right;
136             }
137             d = 0;
138             ptr = interval;
139         }
140     }
141     return 0;
142 }
143
144 int Searchd(Dnode *ptr, int d)
145 {
146     if (d == 2)
147         return 0;
148     else
149     {
150         if (d == 1)
151         {
152             if (ptr->right == nullptr)
153                 return 0;
154             else
155                 return 2;
156         }
157         else
158         {
159             if (ptr->left != nullptr)
160                 return 1;
161             else
162             {
163                 if (ptr->right != nullptr)
164                     return 2;
165                 else
166                     return 0;
167             }
168         }
169     }
170 }

运行结果:

原文地址:https://www.cnblogs.com/WSKIT/p/8438896.html

时间: 2024-10-12 09:41:25

根据广义表建立对应二叉树(子女兄弟链表表示)并由二叉树输出对应广义表(子女兄弟链表表示)的C++非递归实现的相关文章

第4章第3节 二叉树的基本操作(非递归实现)

二叉树的非递归遍历 上一节二叉树的递归遍历中简单介绍了二叉树的递归遍历的实现方式,本节主要介绍二叉树的非递归遍历实现,继续引用上节的例子来说明下. 一.先序遍历 二叉树先序遍历的访问顺序为:根结点->左孩子->右孩子.简单的说,对于任意一个结点,均可以看作是根结点,直接对其访问,如果访问完成后,左孩子不为空,则可以将该左孩子再次看成一个新的根结点,那么就又回到开始,访问根结点,访问左孩子,如果左孩子为空时,访问它的右孩子.对于一般程序而言,递归程序转为非递归程序需要引入栈这个数据结构,可以参考

先序非递归建立二叉树

大二这么久了,第一个学期课程实在太少,而且全都不是CS的专业课,无奈,若是自己不勤奋一点,过了半年,用不到半年,就又变回小白了.所以自己最近也在重新巩固数据结构的知识.刚好看到二叉树这里,觉得二叉树应用广泛,复习的比较细致. 刚开始就是二叉树的建立了,大多数地方都是先序的递归创建,于是便想着试试非递归的代码,倒腾了个把小时,基本上弄出代码了,小女子水平有限,有错误的地方,望路过的大神不吝赐教~~不胜感激! 主要的思路是: 按照先序的顺序输入二叉树,若是遇到空子树,用字符‘#‘表示,例如 左图:A

二叉树的非递归建立

1. 问题描述: 先序非递归建立一颗以二叉链表为存储结构的二叉树.例如建立如下所示的一颗二叉树 A /        \ B             E /      \        / C        D   F 则输入应为: ABC_ _D_ _EF_ _ _      (其中_代表空格). /* * 名 称: 建立二叉树(非递归) * 作 者: Brooke gao * 时 间: 2013/8/21 * */ #include<stdio.h> #include<stdlib.

MySQL数据库存储过程动态表建立(PREPARE)

PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ DEALLOCATE PREPARE statement_name /*删除定义*/ 这是我项目当中用到的,用作参考使用: DELIMITER $$ DROP PROCEDURE IF EXISTS `gpsdata`.`sp_test`$$ CREATE DEFINER=`r

C#综合揭秘——通过修改注册表建立Windows自定义协议

引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对注册表进行修改的情况最为常见,在一般的应用程序中都会涉及.当中最为实用的例子将介绍如何通过"安装项目"修改注册表建立自定义协议,在页面通过ajax方式发送路径请求,并在回调函数中调用自定义协议.最后一节还将介绍如何调用自定义协议去保持数据的保密性.希望本篇文章能对各位的学习研究有所帮助,当

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

表建立联合索引

表建立联合索引后,以两个字段为例,如果想查询速度快,where条件中要么带上两个字段,要么带上前面的,如果只有后面的不会变快. 实例:以下联合索引:itemid和clock 这个联合索引 如果where字段查clock的话 是不能走索引的, 所以查询会慢 . 要想查询变快的话,查itemid,或者两个一起查.

做一个 initial 小于uniform size的实验,验证 该表建立后:建立了minextents 个uniform size的extents.

做一个 initial  小于uniform size的实验,验证 该表建立后:建立了minextents 个uniform size的extents. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL>

【转】C#综合揭秘——通过修改注册表建立Windows自定义协议

引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对注册表进行修改的情况最为常见,在一般的应用程序中都会涉及.当中最为实用的例子将介绍如何通过"安装项目"修改注册表建立自定义协议,在页面通过ajax方式发送路径请求,并在回调函数中调用自定义协议.最后一节还将介绍如何调用自定义协议去保持数据的保密性.希望本篇文章能对各位的学习研究有所帮助,当