当前位置:文档之家› 树 树的遍历 排序

树 树的遍历 排序

} CTree;
孩子兄弟表示法(二叉树表示法)
实现:用二叉链表作树的存储结构,链表中每个 结点的两个指针域分别指向其第一个孩子结点和 下一个兄弟结点
特点
操作容易 破坏了树的层次
孩子兄弟表示法(二叉树表示法) -结点定义
typedef struct CSNode{ datatype Elemdata; struct CSNode *firstchild, *nextsibling; }CSNode, *CSTree;
特点:找双亲容易,找孩子难
双亲表示法-示意
孩子表示法(孩子链表)
多重链表:每个结点有多个指针域,分别指向 其子树的根
孩子表示法(孩子链表)
Typedef struct CTree{ Node *nodelist; List *children; int root; int sizenode,size children; int MaxN;
}
一、求树的深度的算法:
Int TreeDepth( CTree T ) { // T 是树的孩子链表存储结构,
// 返回该树的深度 if (T.n == 0) return 0; else
return Depth( T, T.r ); }// TreeDepth
int Depth( CTree T, int root ) { max = 0;p = T.nodes[root].firstchild; while( p ) {h = Depth( T, p->child ); if ( h > max ) max = h; p = p->nextchild;}//while return max+1;}
森林。
森林的遍历
先序遍历 若森林不空,则访问森林中第一棵树的根结点;
先序遍历森林中第一棵树的子树森林; 先序遍历森林中(除第一棵树之外)其余树构成 的森林。 即:依次从左至右对森林中的每一棵树进行先 根遍历。
中序遍历
若森林不空,则中序遍历森林中第一棵树的子 树森林;访问森林中第一棵树的根结点;中序遍 历森林中(除第一棵树之外)其余树构成的森林。
分类
内排序与外排序
内排序是指在排序期间数据对象全部存放在内存的 排序;
外排序是指在排序期间全部对象个数太多,不能同 时存放在内存,必须根据排序过程的要求,不断在 内、外存之间移动的排序。
排序算法的稳定性
如果在对象序列中有两个对象r[i]和r[j] ,它们 的排序码k[i] ==k[j] , 稳定的:排序前后,对象r[i]和r[ j]的相对位置不 变 不稳定:else
树的遍历方法
广度优先
按层次遍历
先访问第一层上的结点,然后依次遍历第二 层,……,第n层的结点
先序遍历(先根)
深度优先
先访问树的根结点,然后依次先序遍历根的每
棵子树
后序遍历(后根)
先依次后序遍历每棵子树,CDHJ KLNOM 后序遍历:EIFGBCJKNOLMHDA 层次遍历:ABCDE FGHI JKLMNO
二、输出树中所有从根到叶子的路径 的算法
输出二叉树上从根到所有叶子结点的 路径
void AllPath( BiTreeT, Stack&S ) { if(T){
Push( S, T->data ); if(!T->Lchild&& !T->Rchild) PrintStack(S); else
即:依次从左至右对森林中的每一棵树进行后 根遍历。
树、森林和二叉树遍历的对应关系?
第7章 排序
Sorting [严陈]第3章
内容提要
排序的基本概念 排序算法的分析 插入排序(直接,二分) 交换排序(冒泡,快速) 选择(selection,堆排序) 归并(merge) 基数排序
基本概念
复习
树的定义和性质 二叉树的遍历 由遍历序列确定二叉树的问题 线索二叉树 堆 Huffman树 二叉排序树*

树和森林
内容提要
树的存储结构 树的遍历 森林
双亲表示法
实现:定义结构数组存放树的结点,每个结点 含两个域:
数据域:存放结点本身信息 双亲域:指示本结点的双亲结点在数组中位置
树遍历的应用
?如何求树的深度 ?输出树中所有从根到叶子的路径 ?建树的存储结构
提示不同的存储结构实现不同
一、求树的深度的算法:
int Depth(CSTree T) {//T是二叉树表示法
if (T==NULL) return 0; else{ d1 = Depth(T->firstchild); d2 = Depth(T->nextsibling); return Max{d1+1,d2+2}
}// OutPath//
三、建树的存储结构的算法:
和二叉树类似,不同的定义相应有不同的算法。
假设以二元组(F,C)的形式自上而下、自左而右依 次输入树的各边,建立树的孩子-兄弟链表。
见演示程序 森林
森林
可以分解成三部分: 1。森林中第一棵树的根
结点; 2。森林中第一棵树的子
树森林; 3。森林中其它树构成的
{AllPath( T->Lchild, S ); AllPath( T->Rchild, S );} Pop(S); } //if(T) }// AllPath
输出森林中所有从根到叶的路径
voidOutPath( CSTree T, Stack &S ) { while( !T ) { Push(S, T->data ); if( !T->firstchild) Printstack(S); elseOutPath( T->firstchild, S ); Pop(S); T = T->nextsibling; }// while
排序:将一组杂乱无章的数据按一定的 规律顺次排列起来。
数据表( data list): 它是待排序数据对象 的有限集合。
排序码(key):通常数据对象有多个属性域 , 即多个数据成员组成,其中有一个属性域 可用来区分对象,作为排序依据。该域即 为排序码。每个数据表用哪个属性域作为 排序码,要视具体的应用需要而定。
相关主题