4-5二叉树的存储结构_第1页
4-5二叉树的存储结构_第2页
4-5二叉树的存储结构_第3页
4-5二叉树的存储结构_第4页
4-5二叉树的存储结构_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4-5二叉树的存储结构v第四章树和二叉树二叉树的顺序存储结构二叉链表三叉链表学什么?4-5-1二叉树的顺序存储结构v第四章树和二叉树二叉树的顺序存储结构顺序存储结构的要求是什么?用一组连续的存储单元依次存储数据元素,由存储位置表示元素之间的逻辑关系如何利用数组下标来反映结点之间的逻辑关系?完全二叉树中结点的编号可以唯一地反映结点之间的逻辑关系二叉树的顺序存储结构是用一维数组存储二叉树的结点,结点的存储位置(下标)应能体现结点之间的逻辑关系——父子关系ABCDEFHIJ编号为下标

A12345678910

B

C

D

E

F

G

H

I

JconstMaxSize=100;template<typenameDataType>structSeqBiTree{

DataTypedata[MaxSize];intbiTreeNum;};如何定义二叉树的顺序存储结构呢?二叉树的顺序存储结构如果从下标0开始存储,如何表示逻辑关系?ABCDFEG152361310以编号为下标

A12345678910111213

B

C∧

D

F∧

E

G将二叉树按完全二叉树编号:(1)根结点的编号为1(2)若某结点

i有左孩子,则其左孩子的编号为2i(3)若某结点

i有右孩子,则其右孩子的编号为2i+1对于普通的二叉树,如何顺序存储呢?二叉树的顺序存储结构二叉树的顺序存储结构一般仅存储完全二叉树顺序存储一棵右斜树会发生什么情况?ACOG缺点:浪费存储空间二叉树的顺序存储结构4-5-2二叉链表v第四章树和二叉树如何用链接存储方式存储二叉树呢?firsta1a2an∧二叉链表:二叉树的每个结点对应一个链表结点,存放结点的数据信息和指示左右孩子的指针二叉链表的存储方法lchild

datarchildACBDEFGACBDEFGGFEDB∧∧∧∧∧∧∧∧CAroot二叉链表的存储方法叶子结点的标志?左右孩子指针均为空二叉链表的存储结构定义GFEDBA∧∧∧∧∧∧∧∧Ctemplate<typenameDataType>structBiNode{

DataTypedata;BiNode<DataType>*lchild,*rchild;};root如何定义二叉链表的结点呢?n个结点的二叉链表有多少个空指针?2n-(n-1)=n+1个空指针三叉链表的存储方法GFEDBA∧∧∧∧∧∧∧∧C如何查找双亲?时间性能?O(n)在二叉链表中增加一个指向双亲的指针域

lchild

dataparentrchildrootA∧B∧D∧E∧F∧CG∧∧∧∧ACBDEFGroot三叉链表的存储方法二叉链表的类定义二叉树的抽象数据类型定义?template<typenameDataType>classBiTree{public:

BiTree(){root=CreateBiTree(root);}

~BiTree(){ReleaseBiTree(root);}

voidPreOrder(){PreOrder(root);}

voidInOrder(){InOrder(root);}

voidPostOrder(){PostOrder(root);}

voidLevelOrder();private:

BiNode<DataType>*CreateBiTree(BiNode<DataType>*bt);

voidReleaseBiTree(BiNode<DataType>*bt);

voidPreOrder(BiNode<DataType>*bt);

voidInOrder(BiNode<DataType>*bt);

voidPostOrder(BiNode<DataType>*bt);

BiNode<DataType>*root;};InitBiTree:初始化一棵空的二叉树

CreateBiTree:建立一棵二叉树

DestroyBiTree:销毁一棵二叉树PreOrder:前序遍历二叉树InOrder:中序遍历二叉树PostOrder:后序遍历二叉树LevelOrder:层序遍历二叉树先序遍历算法template<typenameDataType>voidBiTree<DataType>::PreOrder(BiNode<DataType>*bt){

if(bt==nullptr)return;

//递归调用的结束条件

else{

cout<<bt->data;

//访问根结点bt的数据域

PreOrder(bt->lchild);

//先序递归遍历bt的左子树

PreOrder(bt->rchild);

//先序递归遍历bt的右子树

}}按照先左后右的方式扫描二叉树,区别仅在于访问结点的时机LRACBDPre(*A)

(1)APre(A->lchild);

Pre(*B)

(2)BPre(B->lchild);

Pre(∧)Pre(*D)

(3)DPre(D->lchild);

Pre(∧)Pre(∧)Pre(B->rchild);Pre(D->rchild);约定:*A表示根指针指向结点Aif(bt==nullptr)return;else{

cout<<bt->data;

PreOrder(bt->lchild);

PreOrder(bt->rchild);}先序遍历算法ACBDPre(*A)

(1)APre(A->lchild);

Pre(*B)

(2)BPre(B->lchild);

Pre(∧)Pre(*D)

(3)DPre(D->lchild);

Pre(∧)Pre(∧)Pre(B->rchild);Pre(D->rchild);Pre(∧)Pre(∧)Pre(*C)

(4)CPre(C->lchild);

Pre(A->rchild);Pre(C->rchild);得到先序遍历序列:ABDCif(bt==nullptr)return;else{

cout<<bt->data;

PreOrder(bt->lchild);

PreOrder(bt->rchild);}先序遍历算法遍历序列:AABCBDCEFGDEFGACBDEFG队列Q初始化;2.如果二叉树非空,将根指针入队;入队出队3.3若结点q存在左孩子,则将左孩子指针入队;3.4若结点q存在右孩子,则将右孩子指针入队;3.循环直到队列Q为空3.1q=队列Q的队头元素出队;3.2访问结点q的数据域;

层序遍历算法template<typenameDataType>voidBiTree<DataType>::LevelOrder(){

BiNode<DataType>*Q[100],*q=nullptr;

intfront=-1,rear=-1;

if(root==nullptr)return;

Q[++rear]=root;

while(front!=rear)

{

q=Q[++front];cout<<q->data;

if(q->lchild!=nullptr)Q[++rear]=q->lchild;

if(q->rchild!=nullptr)Q[++rear]=q->rchild;

}}时间复杂度?每个结点进队一次出队一次O(n)O(n)层序遍历算法遍历是二叉树各种操作的基础,可以在遍历的过程中建立一棵二叉链表在内存中建立一棵二叉链表,如何输入二叉树的信息?构造二叉链表如何由一种遍历序列生成该二叉树?扩展二叉树:将每个结点的空指针引出一个虚结点,其值为一特定值如'#'ACBD先序:AB#D##C##ACBD#####template<typename

DataType>BiNode<DataType>*BiTree<DataType>::CreateBiTree(BiNode<DataType>*bt){

charch;

cin>>ch;

//输入结点的数据信息,假设为字符

if(ch==‘#’)bt=nullptr;

//建立一棵空树

else{

bt=newBiNode<DataType>;

bt->data=ch;

bt->lchild

=CreateBiTree(bt->lchild);//递归建立左子树

bt->rchild

=CreateBiTree(bt->rchild);//递归建立右子树

}

returnbt;}构造二叉链表销毁二叉链表为什么要销毁内存中的二叉链表?二叉链表是动态存储分配,二叉链表的结点是在程序运行过程中动态申请的,在二叉链表变量退出作用域前,要释放二叉链表的存储空间template<typenameDataType>voidBiTree<DataType>::ReleaseBiTree(BiNode<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论