如何把普通树转为二叉树?为什么?
来源:互联网 发布:stm8l101软件复位指令 编辑:程序博客网 时间:2024/06/15 10:25
1.将树转为二叉树
规则:在将普通树转为二叉树的时候,将节点N的兄弟作为N的左孩子,将N节点的左孩子作为N节点的右孩子。
这里就不画图了 自己手底下画一画就能清楚。
当然,将二叉树转为普通树就是一个相逆的过程。
当以二叉链表做树的存储结构时,树的先序遍历和后序遍历完全可以借用二叉树的先序遍历和中序遍历的算法来实现。这也证实我们找到了对数这种复杂问题的简单解决办法。
2.为什么要这么做呢?
- 因为树的遍历序列和二叉树等价,因此可以统一到用二叉树处理
- 用二叉链表存储可以节约很多存储空间
3.简单介绍一下存储结构
(1)顺序存储结构
所谓的顺序存储,就是用一组连续的存储单元来存放二叉树中的节点,一般情况下将节点从上至下,从左至右的存储,但是这样的话 前驱后继之间的领里关系就不能确定了。所以 要使用存储结构的话,是用在存储完全二叉树和满二叉树上比较合适,树中节点的序号能够唯一的反映出节点之间的前驱后继的关系,这样既能最大可能的节省存储空间,又能利用数组元素的下标值确定节点在二叉树中的位置,以及节点之间的关系。
如果非要用在非完全二叉树上,就将结构中的空节点补全为空存储,这样是对空间的消耗,不可取。
(2)链表存储结构
所谓的链式存储结构是指:用链表来存储一颗二叉树,用链来指示元素之间的逻辑关系。
下面简单说一下 二叉链表的存储:
链表中每个节点由三个域组成,除了数据域外,还有两个指针域,分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。结点的存储的结构为:
lchild data rchild
其中,data 域存放某结点的数据信息;lchild 与rchild 分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空。
尽管在二叉链表中无法由结点直接找到其双亲,但由于二叉链表结构灵活,操作方便,对于一般情况的二叉树,甚至比顺序存储结构还节省空间。因此,二叉链表是最常用的二叉树存储方式。
二叉树的二叉链表存储表示可描述为:
typedef struct BiTNode{ elemtype data; struct BiTNode *lchild;*rchild; /*左右孩子指针*/ }BiTNode,*BiTree;
即将BiTree 定义为指向二叉链表结点结构的指针类型。
延伸:
任何一棵树都可以表示成二叉树,并不是任何一棵二叉树都可以表示成树。那么树多还是二叉树多?
1. 任何一棵树都可以表示成二叉树,结合以上题目很容易理解。
2.不是任何一棵二叉树都可以表示成树:
当根节点包含右子树的时候,就无法表示成树了。
3. 树多还是二叉树多的问题:
二叉树也是树的一种,如果按照包含关系来说,树肯定包含二叉树了,树多一些
- 如何把普通树转为二叉树?为什么?
- 将普通树转为二叉树
- 把一个有序的数组转为二叉树存储
- 普通二叉树
- 数据结构-普通二叉树
- 中缀表达式转为二叉树
- 中缀表达式转为二叉树
- poj3437 多叉树转为二叉树
- 二叉树转为有序列表
- 如何将普通树转化为二叉树?
- 把顺序数组转为高度最小的二叉树(算法)
- 把一颗二叉树转为顺序排列的双向链表
- 普通二叉树及其遍历
- 普通二叉树C++实现
- 普通二叉树及其树形
- BZOJ 3224 普通二叉树
- 如何把ppt转为pdf
- 如何按层遍历树 如何按层遍历普通树 注意不是二叉树 是普通树
- Mybatis支持连接多数据库
- 二分搜索——返回有序数组中数组值等于下标值的最左位置
- 自动模具设计技术.pdf
- Leetcode 368. Largest Divisible Subset
- Qt学习14——可拓展对话框
- 如何把普通树转为二叉树?为什么?
- Android退出APP时如何同时结束APP进程
- 记录几个正则表达式
- jquery操作select实现根据拼音动态获取姓名列表
- shiro身份验证入门结合shiro的MD5加密技术自定义Realm-简单Demo
- ColorUsageAttribute
- C++:fatal error LNK1169: 找到一个或多个多重定义的符号
- HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会
- 005 Python语法之运算符-判断语句-random模块