如何把普通树转为二叉树?为什么?

来源:互联网 发布: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. 树多还是二叉树多的问题:
二叉树也是树的一种,如果按照包含关系来说,树肯定包含二叉树了,树多一些