#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* pcurchild = T->firstchild;//获取第一棵子树
while (pcurchild != NULL) {//依次访问每一棵子树
preOrderTrave(pcurchild);//先根遍历子树
pcurchild = pcurchild->nextsibling;//指向T的另一棵子树
}
}
}
//中序遍历
void inOrder(CSTree T) {
if (T != NULL) {
inOrder(T->firstchild);
printf("%c", T->data);
inOrder(T->nextsibling);
}
}
//树的后跟遍历,先访问每棵子树,最后访问根节点
void postOrderTrave(CSTree T) {
if (T != NULL) {
CSTNode* pcurchild = T->firstchild;//获取第一棵子树
while (pcurchild != NULL) {//依次访问每一棵子树
postOrderTrave(pcurchild);//后序访问子树
pcurchild = pcurchild->nextsibling;//访问另一棵子树
}
printf("%c", T->data);//访问根节点
}
}
//124#5#6##37####
int main()
{
CSTree T = NULL;
creatCSTree(T);//建树
//孩子兄弟链表示法树的先根遍历等于二叉树的先序遍历
preOrder(T);//先序遍历1245637
printf("\n");
preOrderTrave(T);//先跟遍历1245637
printf("\n");
//孩子兄弟链表示法树的后根遍历等于二叉树的中序遍历
inOrder(T);//中序遍历4562731
printf("\n");
postOrderTrave(T);//后根遍历4562731
printf("\n");
}
孩子兄弟链创建树并遍历(C语言代码实现)
于 2023-04-27 23:45:12 首次发布