为什么加入fwd和bkwd会使单链表的存储密度度降低


性质1、在二叉树的第i层上至多有2^(i-1)個结点;
性质2、深度为k的二叉树至多有2^k-1个结点;
性质3、对任何一棵二叉树如果其终端节点数为n0,度为2的结点数为n2则n0=n2+1;
性质4、具有n个节點的完全二叉树的深度为[logn]+1 ,这里[ ]表示向下取整
性质5、对一棵有n个节点的完全二叉树的结点按层序编号(从上往下,自左而右)则对任┅结点i(1<=i<=n),有
a、如果i=1则结点i是二叉树的根,无双亲;如果i>1则其双亲PARENT(i)=[i/2],这里[ ]表示向下取整
b、如果2i>n,则结点i无左孩子(即终端结点)否则其左孩子LCHILD(i)=2i;

二叉树的存储结构也可以有顺序存储和链式存储两种。

顺序存储适合完全二叉树对完全二叉树进行编号,编号为i的结點存储在第(i-1)个存储单元中但对一般二叉树采用顺序存储结构,空树也要占用存储单元会浪费存储空间。

链式存储又包括二叉链表和三叉链表前者有2个指针域,分别指向左、右孩子而三叉链表有3个指针域,多出1个指向双亲结点的指针


二叉树的递归遍历算法可以分为先序遍历、中序遍历、后序遍历。假如以L、D和R分别表示遍历左子树、访问根结点和遍历右子树则:

不论按哪一种次序进行遍历,对含有n個结点的二叉树其时间复杂度均为O(n)。

遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列这实质上是对一个非线性序列进行線性化操作,使每个结点在这个线性序列中有且仅有一个直接前驱和后继在二叉链表中,我们只能得到每个结点的左右孩子信息而不能得到结点在某次有序遍历中的直接前驱和后继。一个最简单的办法是在每个结点上增加两个指针域fwd和bkwd分别指示结点在任一次序遍历时嘚到的前驱和后继信息,但这样做会大大降低使结构的单链表的存储密度度我们知道,含有n个结点的二叉链表存在n+1个空链域(由于n0=n2+1因此2n0+n1=n0+n1+n2+1=n+1)。利用这些空链域存储其他有用信息可以得到线索链表,如下图所示


我要回帖

更多关于 单链表的存储密度 的文章

 

随机推荐