码迷,mamicode.com
首页 > 其他好文 > 详细

大话数据结构(十五)——二叉树的理论知识(2)

时间:2016-12-07 01:11:09      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:png   nbsp   tab   2.3   strong   层序遍历   bsp   两个指针   这不   

1 二叉树的存储结构

1.1 顺序存储结构

二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系。

一棵完全二叉树的存储:

技术分享

一般二叉树存储:尽管层序编号不能反映逻辑关系,但是可以将其按完全二叉树编号,只不过把不存在的结点设置为“^”。

技术分享

极端情况,右斜树,这不建议使用

技术分享

 

 1.2 二叉链表

二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的,我们称这样的链表叫做二叉链表。

 

lchild data rchild

 

其中,data是数据域,lchild和rchild都是指针域,分别存放指向左孩子和右孩子的指针。

技术分享

2 遍历二叉树

2.1 二叉树遍历原理

二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。

2.2 二叉树遍历方法

2.2.1 前序遍历

规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

技术分享

2.2.2 中序遍历

规则是若树为空,则空操作返回,否则从根结点开始(注意不是先访问根结点),中序遍历根节点的左子树,然后是访问根结点,最后中序遍历右子树

 技术分享

2.2.3 后序遍历

规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。

技术分享

2.2.4 层序遍历

规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。

技术分享

3、线索二叉树

之前的二叉树:

技术分享

指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树(Treaded Binary Tree)。

技术分享

采用中序遍历:HDIBEAFCG

则黑线表示前驱,棕线表示后继。

 

对二叉树以某种次序遍历使其变为线索二叉树的过程就是线索化。

lchild ltag data rtag rchild

 

其中:

ltag为0时指向该结点的左孩子,为1时指向该结点的前驱;

rtag为0时指向该结点的右孩子,为1时指向该结点的后继。

4、树、森林与二叉树的转换

1、树转换为二叉树

1)加线。在所有兄弟结点之间一条连线

2)去线。对树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线

3)层次调整。以树为根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。注意第一个孩子是二叉树的左孩子,兄弟转换过来的孩子是结点的右孩子。

2、森林转换为二叉树

1) 将每个树转为二叉树

2)第一棵二叉树不动,从第二棵树开始,依次把后一棵二叉树的根结点作为前一棵树的根结点的右孩子,用线连接。

3、二叉树转换为树

二叉树转为树是树转换二叉树的逆过程。

4、二叉树转换为森林

1)从根结点开始,若右孩子在,则把右孩子结点的连线删除,再查看分离后的二叉树,若右孩子在,则删除……直到把所有的右孩子连线都删除,得到二叉树

2)再将每棵树分离后的二叉树转换为树即可。

 

大话数据结构(十五)——二叉树的理论知识(2)

标签:png   nbsp   tab   2.3   strong   层序遍历   bsp   两个指针   这不   

原文地址:http://www.cnblogs.com/snowwang/p/6139468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!