?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
U性表QLinear ListQ?/strong>
h相同Ҏ的数据元素的一个有限序列?/p>
U性表的顺序存储结构—顺序表
U性表的顺序存储结构是指用一块地址q箋的存储空间依ơ存储线性表的数据元素。这U存储方式好比改革前的银行,需要在业务H口前排队取钱。由此可以看出顺序表中逻辑上相ȝ元素在物理上也是盔R的?/p>
序表的特点
1.定w固定
存储序表的元素需要一整块内存I间Q因而顺序表的容量一旦确定,便不能更攏V?/p>
2.讉K速度?/p>
在顺序表使用索引讉K数据元素是非常简单、快速的。如?.3所C,假设序表中的第一个元素的位置是LocQ每个数据元素所占用的存储空间ؓnQ那么可以很快地计算出第i个元素的存储地址为:Loc + (i ?1) * n?/p>
数组
U性表的顺序存储结构在C#中的最直接表现形式是数组。在C#语言中,数组是最基础也是存取速度最快的一U集合类型。数l是引用cdQ保存它们所需的内存空间会在托堆上分配,一旦数l被创徏Q其中的所有元素将被初始化为它们的默认倹{?/p>
int[] arrInt = newint[5];
arrInt[2] = 5;
arrInt[4] = 3;
以上代码声明了一个值类型int的数l,q把它的长度初始化ؓ5Q最后分别给W?和第5个元素赋倹{?/p>
当数l元素ؓ值类型时Q数l对象存攄是值类型对象本w。当元素为引用类型时Q数l对象存攄则是对象的引用(指针Q?/p>
Control[] arrCtrl = new Control[5];
arrCtrl[0] = new Button();
arrCtrl[3] = new Label();
以上代码声明了一个引用类型Control的数l,q把它的长度初始化ؓ5Q最后分别给W?和第4个元素赋倹{两个值是分别Button和Label对象Q虽然它们都l承自Controlc,但两者却是不同类Q它们的大小不一栗?/p>
C#与数据结?-ArrayList
2.2.3 ArrayList
C#中的ArrayList动态改变数l大的。ArrayList又被UCؓ动态数l,它的存储I间可以被动态改变,同时q拥有添加、删除元素的功能?/p>
Insert(int index, object value)Ҏ用于在指定烦引处插入一个元素。ؓ了保证顺序表中的每个元素物理上相邻,插入点后面的所有元素都后UM位?/p>
RemoveAt(int index)Ҏ用于删除指定索引的元素,删除指定元素后,删除点后的所有元素将向前Ud一位?/p>
二叉树的存储l构
二叉树的存储可分ZU:序存储l构和链式存储结构?/p>
1.序存储l构
把一个满二叉树自上而下、从左到右顺序编P依次存放在数l内Q可得到?.8(a)所C的l果。设满二叉树l点在数l中的烦引号为iQ那么有如下性质?/p>
Q?Q?如果i = 0Q此l点为根l点Q无双亲?/p>
Q?Q?如果i > 0Q则其双亲结点ؓ(i -1) / 2 。(注意Q这里的除法是整除,l果中的数部分会被舍弃。)
Q?Q?l点i的左孩子?i + 1Q右孩子?i + 2?/p>
Q?Q?如果i > 0Q当i为奇数时Q它是双亲结点的左孩子,它的兄弟为i + 1Q当i为偶数时Q它是双新结点的叛_子,它的兄弟l点为i ?1?/p>
Q?Q?深度为k的满二叉树需要长度ؓ2 k-1的数l进行存储?/p>
通过以上性质可知Q用数l存放满二叉树的各结炚w常方便,可以Ҏ一个结点的索引号很Ҏ地推出它的双亲、孩子、兄弟等l点的编P从而对q些l点q行讉KQ这是一U存储二叉满二叉树或完全二叉树的最单、最省空间的做法?/p>
Z用结点在数组中的位置反映出结点之间的逻辑关系Q存储一般二叉树Ӟ只需要将数组中空l点所对应的位|设为空卛_Q其效果如图6.8(b)所C。这会造成一定的I间费Q但如果I结点的数量不是很多Q这些浪费可以忽略?/p>
一个深度ؓk的二叉树需? k-1个存储空_当k值很大ƈ且二叉树的空l点很多Ӟ最坏的情况是每层只有一个结点,再用顺序存储结构来存储昄会造成极大地浪费,q时应该用链式存储结构来存储二叉树中的数据?/p>
2.铑ּ存储l构
二叉树的铑ּ存储l构可分Z叉链表和三叉链表。二叉链表中Q每个结炚w了存储本w的数据外,q应该设|两个指针域left和rightQ它们分别指向左孩子和右孩子Q当需要在二叉树中l常L某结点的双亲Q每个结点还可以加一个指向双亲的指针域parent?/p>
3二叉树的深度优先遍历
1.先序遍历
若二叉树为非I,则过EؓQ?/p>
Q?Q?讉K根节炏V?/p>
Q?Q?先序遍历左子树?/p>
Q?Q?先序遍历叛_树?/p>
?.13中,先序遍历是把标号ؓ(1)的结Ҏ搜烦路径讉K的先后次序连接v来,得出l果为:ABDECF?/p>
2.中序遍历
若二叉树为非I,则过EؓQ?/p>
Q?Q?按中序遍历左子树?/p>
Q?Q?讉K根结炏V?/p>
Q?Q?按中序遍历右子树?/p>
?.13中,先序遍历是把标号ؓ(2)的结Ҏ搜烦路径讉K的先后次序连接v来,得出l果为:DBEACF?/p>
3.后序遍历
若二叉树为非I,则过EؓQ?/p>
Q?Q?按后序遍历左子树?/p>
Q?Q?按后序遍历右子树
Q?Q?讉K根结炏V?/p>