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

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)再将每棵树分离后的二叉树转换为树即可。

时间: 2024-10-21 14:20:34

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

大话数据结构(十三)——树的理论知识

1.树的定义 树(Tree)是n(n>=0)个结点的有限集. n=0时称为空树. 在任意一棵非空树中: (1)有且仅有一个特定的称为根(root)的结点. (2)当n>1时,其余结点可以分为m(m>0)个互不相交的有限集T1,T2,T3--Tm,其中每个集合本身又是一棵树,并且称为根的子树(SubTree). 1.1 结点分类 树的结点包含一个数据元素及若干指向其子树的分支. (1)结点拥有的子树数称为结点的度(Degree). (2)度为0的结点称为叶结点(leaf)或者终端结点:度不

第三,四,五,章节理论知识的总结

第三章 认识运算符和表达式 ,运算符又叫操作符,是一个用于运算的符号,作用于一个或多个操作数.运算符分类:一元(目)运算符,作用于一个操作数.二元(目)运算符,作用于两个操作数.三元(目)运算符,作用于三个操作数.按运算符的功能分类:算术运算符,用于数学运算.逻辑运算符,判断真假.位运算符,用于二进制运算.其他.表达式:一条有意义的语句,并且该语句至少包含一个操作数和一个操作符,每个表达式,都有一个返回类型,每个表达式都可以与其他表达式进行运算,只要类型符合要求.位运算符主要用于对数字二进制运算

大话数据结构(五)(java程序)——顺序存储结构的插入与删除

获得元素操作 对于线性表的顺序存储结构来说,我们要实现getElement操作,即将线性表的第i个位置元素返回即可 插入操作 插入算法思路: 1.如果插入位置不合理,抛出异常 2.如果插入表的长度大于等于数组长度,则抛出异常或动态增容 3.从最后一位元素开始向前遍历到第i个位置,分别把它们都向后移动一个位置 4.将要插入元素填入位置i处 5.表长度加1 删除操作 1.如果删除位置不合理,抛出异常 2.取出插入元素 3.从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一位 4.表长度

35. 蛤蟆的数据结构笔记之三十五遍历二叉树

35. 蛤蟆的数据结构笔记之三十五遍历二叉树 本篇名言:"冬天已经到来,春天还会远吗? --雪莱" 我们来看徐璈如何遍历二叉树. 欢迎转载,转载请标明出处: 1.  二叉树遍历 二叉树的遍历有三种方式,如下: (1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树.简记根-左-右. (2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树.简记左-根-右. (3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点.简记左-右-根. 2.

15. 蛤蟆的数据结构进阶十五排序实现之堆排序

15. 蛤蟆的数据结构进阶十五排序实现之堆排序 本篇名言:"谁要是游戏人生 ,他就一事无成 ; 谁不能主宰自己 ,永远是一个奴隶.--歌德" 继续来看下堆排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47733553 1.  堆排序 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完全二叉树

【大话QT之十五】ctkPluginFrameWork插件系统Windows下编译

使用ctkPluginFramework作为插件系统框架的确有着众多开发上的优势.最近收到一些站内信,大家都想使用ctkPluginFramework但是不知道如何编译,这篇教程就来讲一讲ctkPluginFramework插件系统在Windows下的编译过程. 准备条件: 1. 安装Git,我们通过它来下载CTK的源码. 2. 安装CMake,我们用它来生成vs下的sln解决方案文件. 相关站点: 1. CTK的官网:http://www.commontk.org/index.php/Main

SDUT 3344 数据结构实验之二叉树五:层序遍历

数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. Input 输入数据有多行,第一行是一个整数t (t<1000),代表有t行测试数据.每行是一个长度小于50个字符的字符串. Output 输出二叉树的层次遍历序列. Example I

15、蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题

15.蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题 本篇名言:"人的一生应当这样度过:当回忆往事的时候,他不致于因为虚度年华而痛悔,也不致于因为过去的碌碌无为而羞愧:在临死的时候,他能够说:"我的整个生命和全部精力,都已经献给世界上最壮丽的事业--为人类的解放而斗争." 继续递归问题,本次是经典的八皇后问题: 欢迎转载,转载请标明出处: 1.  八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出

马凯军201771010116《面向对象与程序设计Java》第十五周学习知识总结

实验十五  GUI编程练习与应用程序部署 一.知识学习部分 清单文件 每个JAR文件中包含一个用于描述归档特征的清单文件(manifest).清单文件被命名为MANIFEST.MF,它位于JAR文件的一个特殊的META-INF子目录中. 最小的符合标准的清单文件是很简单的:Manifest-Version:1.0复杂的清单文件包含多个条目,这些条目被分成多个节.第一节被称为主节,作用于整个JAR文件.随后的条目用来指定已命名条目的属性,可以是文件.包或者URL. 清单文件的节与节之间用空行分开,