广义表与二叉树之间的相互转换

二叉树是树形结构中一种特殊的树,其特点是每个结点最多只有两个孩子结点。二叉树除了可以通过典型的树状图来表示外,还可以使用广义表进行表示,例如:A(B,C)表示根结点A的左孩子结点为B,右孩子结点为C;A(,C)表示根结点A的左子树为空,右孩子结点为C。依此类推,可以将任何一棵二叉树以广义表的形式表示出来。

广义表转化为二叉树
广义表转化成二叉树可以借助栈来实现,利用栈先进后出的特点,先将根结点压入栈中,如果左孩子结点不为空,则将其作为栈顶结点的左孩子结点,并压入栈中,递归左子树,处理完之后左孩子结点出栈;如果右孩子不为空,则将其作为栈顶结点的右孩子结点,并压入栈中,递归右子树,处理完之后右孩子结点出栈。

/*
设置一个标记变量flag,初始值为-1,并设置一个标记结点
循环遍历广义表的字符串str如果str[i]是左括号:把flag置为0;把p压入栈中否则如果str[i]是逗号:把flag置为1;否则如果str[i]是右括号:则栈顶元素出栈;否则如果str[i]是一个字母,则用结点temp来存储;如果flag为-1:则把temp作为根结点并压入栈中如果flag为0:如果此时栈顶结点为p,则先出栈,然后将temp作为栈顶结点的左孩子,并将temp压入栈中如果flag为1:栈顶元素出栈,将temp作为栈顶结点的右孩子,并将temp压入栈中
*/
Node *build(const string &str) {int len = str.size();if(len == 0) return NULL;stack<Node *> stk;Node *temp = NULL, *p = new Node('#');int flag  = -1;for(int i = 0; i < len; i++) {if(str[i] == '(') {stk.push(p);flag = 0;}else if(str[i] == ',') {flag = 1;}else if(str[i] == ')') {stk.pop();}else if(isalpha(str[i])){temp = new Node(str[i]);if(flag == -1) {stk.push(temp);}else if(flag == 0) {if(!stk.empty() && stk.top() == p) stk.pop();if(!stk.empty()) {stk.top()->lchild = temp;stk.push(temp);}}else if(flag == 1) {if(!stk.empty()) stk.pop();if(!stk.empty()) {stk.top()->rchild = temp;stk.push(temp);}}}}delete p;if(!stk.empty())return stk.top();else return NULL;
}

二叉树以广义表的形式输出
类比二叉树的先序遍历,先输出根结点,如果左孩子不为空则递归输出左子树,如果右孩子不为空则递归输出右子树,然后在输出的过程中合适的地方输出逗号和括号。

/*
输出结点存储的值
如果左孩子不为空:输出'('递归输出左子树如果右孩子为空输出')'
如果右孩子不为空:如果左孩子为空输出'('输出','递归输出右子树输出')'
*/
void retable() {cout << data;if(lchild != NULL) {cout << '(';lchild->retable();if(rchild == NULL) {cout << ')';}}if(rchild != NULL) {if(lchild == NULL) {cout << '(';}cout << ',';rchild->retable();cout << ')';}
}

广义表与二叉树之间的相互转换相关推荐

  1. java 广义表_java 输入广义表 生成二叉树 | 学步园

    今天我要分享我学习用广义表生成二叉树的代码 这里我参考了  张二青博主的一些知识 http://my.csdn.net/zhangerqing 下面我进行分析了  比如输入广义表  (有关字符串的定义 ...

  2. 二叉树:广义表搭建二叉树

    使用广义表搭建二叉树(及层序遍历) 问题概要 二叉树是非常常见的数据结构,那么,如何从无到有构建一棵二叉树呢?比较主流的方法就是输入一个广义表,例如A(B(D),C),这种形式.那么,如何把这种字符串 ...

  3. 按广义表表示二叉树结构生成二叉树链表的算法

    用广义表表示二叉树结构如下: (A (B (,D (E,E),C)) 算法如下: #include <stdio.h> #include <stdlib.h>// 定义节点 t ...

  4. 广义表和二叉树的转换

    //广义表转二叉树: 设置一个标记变量k,初始值为-1: 设置一个标记结点p: 循环遍历广义表的字符串str:     如果str[i]是左括号:         则设置k为0:         把p ...

  5. [数据结构]树、森林与二叉树之间的相互转换方法

    树.二叉树与森林的相互转换 本文只给出树.森林与二叉树之间的转换方法,而详细的证明过程不在本文讨论范围之内. 树 → 二叉树 在所有兄弟结点之间加一连线. 对每个结点,除了保留与其长子的连线外,去掉该 ...

  6. 树与二叉树之间的相互转换、树的遍历

    树与二叉树的转换.树的遍历 树和二叉树不同,可以有0到n个孩子,所以实现起来很麻烦,但我们可以借助树的孩子兄弟表示法把树转换成二叉树. 在孩子兄弟表示法中,某个结点的第一个孩子结点的指针是二叉树中其左 ...

  7. MySQL中竖表和横表之间的相互转换

    MySQL中竖表和横表之间的相互转换 1.  横表转为竖表 表tb的结构为 表中的数据为 现在要求查询到如下结果 使用的SQL查询语句应该如下: 或者使用下面查询 2.  竖表转为横表 tb2表的结构 ...

  8. 数据结构之【数组和广义表】复习题

                          第 4  章  数组和广义表 一.选择题 1. 将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元素A666 ...

  9. 数据结构05数组和广义表

    第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展:表中的数据元素本身也是一个数据结构. 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束,每个元素都有一个直接后继元素 ...

最新文章

  1. TabSpec与TabHost
  2. 优雅的在终端中编写Python
  3. go语言编程项目_一个项目需要多少种编程语言?
  4. Python在Win10系统的安装和使用配置
  5. 为什么这本搜索引擎营销的书畅销呢?
  6. 推荐一些优质原创公众号
  7. uniapp跳转指定小程序
  8. ICEM 网格划分技巧(21-5)
  9. 关于studio 3T
  10. java设置excel自动调整行高_Java 设置Excel自适应行高、列宽
  11. Cartographer 3D 建图实战-(基于禾赛32线雷达和Xsens MTi-G-710 组合导航模块,松灵Scout mini 底盘实际进行实验)
  12. port bridge enable命令导致的环路
  13. 银河麒麟4.0.2安装
  14. Nanopore 纳米孔 测序数据处理 微生物 16S全长 Centrifuge的安装和使用
  15. 斑马GK888t 通过IP访问连接
  16. js模板字符串自定义类名_详解JavaScript ES6中的模板字符串
  17. 幸福的前奏---三叶草的海洋
  18. python赋值和控制语句_Python流程控制语句
  19. java中事务并发问题是_事务必会必知
  20. “大数据杀熟”杀的是你吗?

热门文章

  1. NOI / 1.6编程基础之一维数组01:与指定数字相同的数的个数
  2. Spring 5(黑马)
  3. CSS 奇思妙想边框动画
  4. 小暑将至,一起来看看品牌小暑海报吧
  5. C++简单的倒计时demo
  6. php实训报告英文摘要,English Abstract _和大家分享下如何写英文摘要
  7. VoLTE KPI指标分类和定义
  8. Java的POI-word模板生成目录自动更新
  9. 从RGB色转为灰度色算法
  10. ZEMAX | 如何设置镜头卡口的机械参考以进行热分析