树和森林(学习记录)

一、存储结构

孩子兄弟存储

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;
    }
}
posted @ 2021-05-03 14:57  inss!w!  阅读(118)  评论(0编辑  收藏  举报