树和森林(学习记录)
一、存储结构
孩子兄弟存储
typedef struct CSNode,*CSTree;{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
二、树的遍历规则
树的先根遍历和后根遍历相当于二叉树的先序遍历和中序遍历
森林的先序遍历和中序遍历相当于二叉树的先序遍历和中序遍历
三、树的遍历应用
1.求树的深度
类似于二叉树的深度
int TreeDepth(CSTree T){
if(!T)
return 0;
else{
h1 = TreeDepth(T->firstchild); //子树的深度
h2 = TreeDepth(T->nextsibling); //兄弟的深度
return max(h1+1,h2);
}
}
2.输出树中所有从根到叶子的路径
可以画图理解
栈中的结点含义:当前结点的所有子树路径还没有输出完,就保存在路径中
void AllPath(BiTree T,Stack &S){
//输出二叉树根到叶子所有路径
if(T){
Push(S,T->data);
if(!T->lchild && !T->rchild)
PrintStack(S);
else{
AllPath(T->lchild,S);
AllPath(T->Rchild,S);
}
Pop(S);
}
}
void OutPath(BiTree T,Stack &S){
//输出森林中从根到叶子的所有路径
while(T){
Push(S,T->data);
if(!T->firstchild)
PrintStack(S);
else{
OutPath(T->firstchild,S);
}
Pop(S);
T = T->nextsibling;
}
}