#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 preOrderTrave(CSTree T)
{
if (T!=NULL)
{
printf("%c", T->data);
CSTNode* pcur = T->firstchild;
while (pcur!=NULL)
{
preOrderTrave(pcur);
pcur = pcur->nextsibling;
}
}
}
//中序遍历
void inorder(CSTree T)
{
if (T!=NULL)
{
inorder(T->firstchild);
printf("%c", T->data);
inorder(T->nextsibling);
}
}
//树的后根遍历
void inorderTree(CSTree T)
{
if (T!=NULL)
{
CSTNode* pcur = T->firstchild;
while (pcur)
{
inorderTree(pcur);
pcur = pcur->nextsibling;
}
printf("%c", T->data);
}
}
//释放
void freeTree(CSTree T)
{
if (T!=NULL)
{
free(T->firstchild);
free(T->nextsibling);
free(T);
}
}
int main()
{
CSTree T = NULL;
//创建
creatCSTree(&T);
//前序遍历
preorder(T);
printf("\n");
//树的先根遍历
preOrderTrave(T);
printf("\n");
//中序遍历
inorder(T);
printf("\n");
//树的后根遍历
inorderTree(T);
//释放
freeTree(T);
return 0;
}
输入124#5#6##3#7###
不懂为什么输入124#5#6##3#7###的可以看看这个孩子兄弟法画图