数据结构 - 二叉树的存储结构

顺序存储结构

二叉树存储结构的类型定义:

#define MAX_SIZE  100
 typedef telemtype sqbitree[MAX_SIZE];

用一组地址连续的存储单元依次“自上而下、自左至右”存储完全二叉树的数据元素。

对于完全二叉树上编号为i的结点元素存储在一维数组的下标值为i-1的分量中,如图6-6(c)所示。

对于一般的二叉树,将其每个结点与完全二叉树上的结点相对照,存储在一维数组中,

链式存储结构

设计不同的结点结构可构成不同的链式存储结构。

(1) 结点的类型及其定义

① 二叉链表结点。有三个域:一个数据域,两个分别指向左右子结点的指针域

typedef struct BTNode
{  ElemType  data ;
struct BTNode  *Lchild , *Rchild ;
}BTNode ; 

② 三叉链表结点。除二叉链表的三个域外,再增加一个指针域,用来指向结点的父结点

typedef struct BTNode_3
{  ElemType  data ;
struct BTNode_3  *Lchild , *Rchild , *parent ;
}BTNode_3 ; 

遍历二叉树(Traversing Binary Tree)

遍历二叉树(Traversing Binary Tree):是指按指定的次序(规律)依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

访问:指对结点做某种处理。如:输出信息、修改结点的值等。

次序(规律):二叉树是一种非线性结构,每个结点都可能有左、右两棵子树,所以在访问完一个结点之后,下一个被访问的结点面临着不同的选择。因此,需要寻找一种次序(规律),使二叉树上的结点能排列在一个线性队列上,从而便于遍历。

二叉树的基本组成:根结点、左子树、右子树。若能依次遍历这三部分,就是遍历了二叉树。

若以L、D、R分别表示遍历左子树、遍历根结点和遍历右子树,则有六种遍历方案:DLR、LDR、LRD、DRL、RDL、RLD。
   若规定先左后右,则只有前三种情况三种情况,分别是:

DLR——先(根)序遍历。

LDR——中(根)序遍历。

LRD——后(根)序遍历。

已知二叉树,写出先序序列、中序序列、后序序列

已知先序序列和中序序列,确定二叉树

已知后序序列和中序序列,确定二叉树

遍历算法

对于二叉树的遍历,分别讨论递归遍历算法和非递归遍历算法。

递归遍历算法具有非常清晰的结构,但初学者往往难以接受或怀疑,不敢使用。实际上,递归算法是由系统通过使用堆栈来实现控制的。

非递归算法中的控制是由设计者定义和使用堆栈来实现的。

先序遍历二叉树

1 递归算法

算法的递归定义是:

若二叉树为空,则遍历结束;否则

⑴ 访问根结点;

⑵ 先序遍历左子树(递归调用本算法);

⑶ 先序遍历右子树(递归调用本算法)。

先序遍历的递归算法
void  PreorderTraverse(BTNode  *T)
     {    if  (T==NULL)
                return;
    visit(T->data) ;       /*  访问根结点  */
PreorderTraverse(T->Lchild) ; //再先序遍历左子树
PreorderTraverse(T->Rchild) ; //再先序遍历右子树
}
说明:1、visit()函数是访问结点的数据域,其要求视具体问题而定,可以是最简单的打印输出。
      2、树采用二叉链表的存储结构,用指针变量T来指向。

2 非递归算法

设T是指向二叉树根结点的指针变量,非递归算法是:

若二叉树为空,则返回;否则,令p=T;

⑴ 访问p所指向的结点;

⑵ q=p->Rchild ,若q不为空,则q进栈;

⑶ p=p->Lchild ,若p不为空,转(1),否则转(4);

⑷ 退栈到p ,转(1),直到栈空为止。

算法实现:

#define  MAX_STACK_SIZE  50
void  PreorderTraverse( BTNode  *T)
{  BTNode  *Stack[MAX_STACK_SIZE ] ,*p=T, *q ;
int  top=0 ;
if  (T==NULL)  printf(“ Binary Tree is Empty!\n”) ;
else {  do
      {  visit( p-> data ) ;   q=p->Rchild ;
          if  ( q!=NULL )  stack[top++]=q ;
          p=p->Lchild ;
          if (p==NULL&& top!=0)
             {top-- ;p=stack[top] ; }
      }
   while (p!=NULL) ;
}
}
时间: 2024-10-09 05:27:26

数据结构 - 二叉树的存储结构的相关文章

数据结构--树(上)-- 二叉树及存储结构

二叉树及存储结构 二叉树的定义:一个有穷的结点集合.若不为空,则它是由根节点和称为其左子树和右子树的两个不想交的二叉树组成 一般的左右的树是没有左右之分的.二叉树有左右之分. 三种特殊的二叉树 斜二叉树         实质就可以是链表了. 完美二叉树 完全二叉树 二叉树的几个重要的性质 二叉树的抽象数据类型 对二叉树来讲,最重要的就是Traversal() 遍历,讲二叉树基本就讲遍历了. 二叉树的存储结构 顺序存储结构 顺序存储结构 可以存储完全二叉树:从上往下,从左往右,来进行便利.把这种树

二叉树的存储结构

二叉树的存储结构有两种:顺序存储结构和链式存储结构. 顺序存储结构 对于满二叉树和完全二叉树来说,可以将其数据元素逐层存放到一组连续的存储单元中,如图6-3 所示.用一维数组来实现顺序存储结构时,将二叉树中编号为i 的结点存放到数组中的第i 个分量中.如此根据性质6.7,可以得到结点i 的父结点.左右孩子结点分别存放在.2i 以及2i+1 ?i / 2? 分量中. 图6-3 顺序存储结构 这种存储方式对于满二叉树和完全二叉树是非常合适也是高效方便的.因为满二叉树和完全二叉树采用顺序存储结构既不浪

二叉树及存储结构

本文的结构: 二叉树的基本形态 二叉树的重要性质 二叉树的抽象数据类型定义 二叉树的存储结构 二叉树T:一个有穷的节点集合.这个集合可以为空,若不为空,则它是由根节点和称为其左子树TL和右子树TR的两个不相交的二叉树组成 二叉树的五种基本形态: (a) 空树 (b) 有一个结点 (c) 右子树为空 (d) 左子树为空 (e) 有左右子树 二叉树的重要性质: 一个二叉树第i层的最大节点数为:2i-1,i >=1; 深度为k的二叉树有最大结点总数为 2k-1,k>=1: 对任何非空二叉树T,若n0

树1-2、二叉树及存储结构

二叉树的定义: 二叉树的重要性质: 二叉树的存储结构:用数组存储完全二叉树 二叉树的存储结构:用链表存储 原文地址:https://www.cnblogs.com/maider/p/11362237.html

js数据结构与算法存储结构

数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 栈(stack):运算只在表的

数据结构 - 图的存储结构

图的抽象数据类型定义 图是一种数据结构,加上一组基本操作就构成了图的抽象数据类型. 图的抽象数据类型定义如下: ADT Graph{ 数据对象V:具有相同特性的数据元素的集合,称为顶点集. 数据关系R:R={VR} VR={<v,w>|<v,w>| v,w?V∧p(v,w) ,<v,w>表示 从v到w的弧,P(v,w)定义了弧<v,w>的信息 } 基本操作P: Create_Graph() : 图的创建操作. 初始条件:无. 操作结果:生成一个没有顶点的空图

数据结构之图(存储结构、遍历)

新学期开始了,开始专心于技术上了,上学期的寒假总是那么短暂,飘飘乎就这样逝去,今天补补上学期还没学完的数据结构---图,希望能和大家一起探讨,共同进步~ 定义: 图是由顶点集合及顶点间的关系集合组成的一种数据结构. 图的存储结构: 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图. 从上面可以看出,无向图的边数组是一

数据结构 - 逻辑结构和存储结构

程序=算法+数据结构 N.沃思(Niklaus Wirth)教授提出: 程序=算法+数据结构 以上公式说明了如下两个问题: (1)算法决定如何构造和组织数据(算法→数据结构). (2)算法的选择依赖于作为基础的数据结构(数据结构→算法). 软件=程序+文档(软件工程的观点) 求解非数值计算的问题 主要考虑的是设计出合适的数据结构及相应的算法. 即:首先要考虑对相关的各种信息如何表示.组织和存储? 因此,可以认为:数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作

数据结构 - 图的存储结构表示及其遍历 (DFS &amp;&amp; BFS)

1.邻接矩阵表示的图结构 /* 邻接矩阵表示的图结构 */ #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <queue> #include <stack> using namespace std; typedef char VertexType; //顶点类型应由用户定义 typedef int EdgeType; /