森林先序遍历算法思想:先访问森林中一棵树的根节点,依次对该树的结点(子树的根)进行先根遍历,最后先序遍历森林中其余待访问的树。
森林的中序遍历算法思想:对第一颗树的结点(子树的根)进行后根遍历,然后访问该树的根节点,再对森林中其他树进行中序遍历.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType;
typedef struct CSTNode {
ElemType data;
struct CSTNode* firstChild;
struct CSTNode* nextSibling;
}CSTNode,*CSTree;
//先序创建森林(孩子兄弟链)
void creatCSTree(CSTree& T) {
ElemType ch;
scanf("%c", &ch);
if (ch == '#') {
T = NULL;
}
else {
T = (CSTNode*)malloc(sizeof(CSTNode));
T->data = ch;
creatCSTree(T->firstChild);
creatCSTree(T->nextSibling);
}
}
//先序遍历二叉树,检验建树是否成功
//void preOrder(CSTree T) {
// if (T != NULL) {
// printf("%c", T->data);
// preOrder(T->firstChild);
// preOrder(T->nextSibling);
// }
//}
//树的先根遍历算法
void preOrder(CSTNode* pnode) {
if (pnode != NULL) {
printf("%c", pnode->data);//访问根结点
CSTNode* pcurchild = pnode->firstChild;//获取第一棵子树
while (pcurchild != NULL) {//依次访问每一棵子树
preOrder(pcurchild);//先根遍历子树
pcurchild = pcurchild->nextSibling;//指向T的另一棵子树
}
}
}
//先序遍历森林
//算法思想:先访问森林中一棵树的根节点,依次对该树的结点(子树的根)进行先根遍历,最后先序遍历森林中其余待访问的树
void preOrderTraves(CSTree T) {
if (T != NULL) {
printf("%c", T->data);//访问第一颗树的根节点
//依次对该树的结点(子树的根)进行先根遍历
for (CSTNode* pcurchild = T->firstChild; pcurchild != NULL; pcurchild = pcurchild->nextSibling) {
preOrder(pcurchild);
}
//先序遍历森林中其他的树
preOrderTraves(T->nextSibling);
}
}
//树的后跟遍历,先访问每棵子树,最后访问根节点
void postOrder(CSTree T) {
if (T != NULL) {
CSTNode* pcurchild = T->firstChild;//获取第一棵子树
while (pcurchild != NULL) {//依次访问每一棵子树
postOrder(pcurchild);//后序访问子树
pcurchild = pcurchild->nextSibling;//访问另一棵子树
}
printf("%c", T->data);//访问根节点
}
}
//森林的中序遍历
//算法思想:对第一颗树的结点(子树的根)进行后根遍历,然后访问该树的根节点,再对森林中其他树进行中序遍历
void inOrderTrave(CSTree T) {
if (T != NULL) {
//对第一颗树的结点(子树的根)进行后根遍历
for (CSTNode* pcurchild = T->firstChild; pcurchild != NULL; pcurchild = pcurchild->nextSibling) {
postOrder(pcurchild);
}
printf("%c", T->data);//访问树的根节点
inOrderTrave(T->nextSibling);//对森林中其他树进行中序遍历
}
}
//AB#D#E##C#RS#T###
int main() {
CSTree T = NULL;
creatCSTree(T);
//preOrder(T);//检验建森林是否成功
//printf("\n");
preOrderTraves(T);//先序遍历森林
printf("\n");
inOrderTrave(T);//中序遍历森林
printf("\n");
return 0;
}