// 孩子兄弟表示法实际就是创建一棵二叉树
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef char DataType;
typedef struct TNode
{
DataType data; // 数据域
struct TNode * fchild; // 第一个孩子指针域
struct TNode * rsibling; // 右兄弟指针域
}*Tree;
int n = 0;
void Creat_Tree(Tree * T); // 建立树(类似建立二叉树)
bool Search_Node(Tree T, char temp); // 搜查某个结点以及它的兄弟结点
void PreOrder_Traverse(Tree T); // 前序遍历
void InOrder_Traverse(Tree T); // 中序遍历
void PostOrder_Traverse(Tree T); // 后序遍历
int main()
{
Tree T;
printf("请输入根结点:");
Creat_Tree(&T);
Search_Node(T, 'C');
printf("\n先序遍历:");
PreOrder_Traverse(T);
printf("\n");
return 0;
}
// 防止产生空指针异常
void Creat_Tree(Tree * T)
{
char ch;
scanf("%c",&ch);
fflush(stdin);
if(ch == '#')
{
*T = NULL;
return;
}
else
{
*T = (Tree)malloc(sizeof(struct TNode));
(*T)->data = ch;
n++;
printf("请输入%c的第一个孩子:", ch);
Creat_Tree(&(*T)->fchild);
printf("请输入%c的右兄弟:", ch);
Creat_Tree(&(*T)->rsibling);
}
}
bool Search_Node(Tree T, char temp)
{
if(!T)
return false;
if(T->data == temp)
{
if(T->rsibling != NULL)
{
Tree p = T->rsibling;
printf("\n查找成功!\n");
printf("查找的结点:%c\n",temp);
printf("%c的右兄弟:%c\n",temp,p->data);
return true;
}
else
{
printf("\n\n抱歉!查找失败\n");
return false;
}
}
Search_Node(T->fchild, temp);
Search_Node(T->rsibling, temp);
}
void PreOrder_Traverse(Tree T)
{
if(!T)
return;
else
{
printf("%3c",T->data);
PreOrder_Traverse(T->fchild);
PreOrder_Traverse(T->rsibling);
}
}