树的双亲表示法:使用顺序表
/*#include<stdio.h>
#include<stdlib.h>
//节点结构
typedef struct Node
{
char data;
int parent;
}Node;
//树的结构
typedef struct Tree{
Node Node[10];
int n; //树的节点个数
}Tree;
//创建树
void create_Tree(Tree *T){
int numNode,i,j=0;
char data;
printf("请输入节点个数: ");
scanf("%d",&numNode);
T->n = numNode;
//申请内存
//各个节点进行赋值
for(i=0; i< numNode; i++){
fflush(stdin);
printf("请输入第%d个节点\n",i);
scanf("%c%d",&data,&j);
T ->Node[i].data = data;
T ->Node[i].parent = j;
}
}
//查找某个节点
void search_Node(Tree* T,char temp){
int i;
int flag = 0;
for(i=0; i< T->n; i++){
if(T ->Node[i].data == temp){
flag = 1;
printf("%c parentnode's the index is %d",T ->Node[i].data,T ->Node[i].parent);
break;
}
}
if(!flag){
printf("no node");
}
}
int main(){
Tree T; //
char ch;
create_Tree(&T);
printf("请输出想要查找的节点: \n");
fflush(stdin); //
scanf("%c",&ch);
search_Node(&T,ch);
printf("\n");
return 0;
}
*/
孩子表示法:顺序表+链表
/*#include<stdio.h>
#include<stdlib.h>
//链表节点
typedef struct ChildNode
{
int index;
struct ChildNode* linkchartNode;
}LNode;
//节点的定义
typedef struct Node
{
char data;
struct ChildNode* child; //链表
}Node, *TreeNode;
//树的结构
typedef struct Tree
{
Node node[5]; //顺序表
int n; //树节点的个数
}Tree;
//创建数组并存储
void create_Tree(Tree *T){
int linknodetest;
int i;
LNode* p ;
//创建节点个数
printf("请输入节点的个数:\n");
fflush(stdin);
scanf("%d",&(T ->n));
//逐个赋值
for(i = 0; i < T->n; i++){
int j = 0;
printf("请输入第%d节点的data: ",i);
fflush(stdin);
scanf("%c",&(T->node[i].data));
//创建第i个顺序表的节点
T->node[i].child = (LNode *)malloc(sizeof(LNode));
T->node[i].child ->linkchartNode = NULL;
//为链表节点赋值
printf("请输入孩子节点的数量: ");
scanf("%d",&linknodetest);
p = T->node[i].child;
while(j <linknodetest){
LNode* newlinknode = (LNode *)malloc(sizeof(LNode));
newlinknode ->linkchartNode = NULL;
printf("请输出第%d个节点的第%d个孩子节点:\n",i,j);
fflush(stdin);
scanf("%d",&(newlinknode ->index));
p ->linkchartNode = newlinknode;
p = p ->linkchartNode;
j++;
}
}
}
//搜索树的某个节点
void Search_Node(Tree *T,char temp){
int i;
int flag =0;
LNode* p ;
for(i = 0; i < T->n; i++){
if(temp == T->node[i].data){
flag = 1;
printf("%c ",T->node[i].data);
//还需要将孩子节点输出
p = (T->node[i].child) ->linkchartNode ;
printf("孩子节点有:");
while(p){
printf("%c ",T->node[p ->index].data);
p = p ->linkchartNode;
}
break;
}
}
if(!flag){
printf("no node!");
}
}
int main(){
Tree T;
char ch;
create_Tree(&T);
printf("请输入搜索的节点:\n");
fflush(stdin);
scanf("%c",&ch);
Search_Node(&T,ch);
printf("\n");
return 0;
}
*/
孩子兄弟表示法:链表
//用孩子兄弟法表示树,本质上就是创建二叉树
#include<stdio.h>
#include<stdlib.h>
//链表节点结构
typedef struct Node{
char data;
struct Node* child;
struct Node* brother;
}LinkNode;
int n = 1;
void createTree_ChildAndParent(LinkNode *T){
char temp;
//节点个数
scanf("%c",&temp);
getchar();
fflush(stdin);
if(temp =='#'){
n--;
T = NULL;
}else{
T = (LinkNode *)malloc(sizeof(LinkNode));
T->data = temp;
printf("output %c\n",temp);
n++;
createTree_ChildAndParent(T->child);
createTree_ChildAndParent(T->brother);
}
}
//中序遍历
void mid_Search(LinkNode *T){
if(T){
mid_Search(T->child);
printf("%c ",T->data);
mid_Search(T->brother);
}
}
int main(){
LinkNode T;
printf("请输入节点的信息:\n");
createTree_ChildAndParent(&T);
mid_Search(&T);
return 0;
}