forked from Vencenter/C_Code
-
Notifications
You must be signed in to change notification settings - Fork 0
/
二叉树_森林_孩子表示法_.cpp
151 lines (145 loc) · 2.67 KB
/
二叉树_森林_孩子表示法_.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include<stdio.h>
#include<stdlib.h>
#define max 40
#define ElemType char
typedef struct ENode
{
struct ENode *next;
int child;
}ENode;
typedef struct TNode
{
ENode *first;
ElemType data;
}TNode;
typedef struct TreeNode
{
TNode nodes[max];
int n,r;
}TreeNode;
int createTree(TreeNode &T)
{
printf("请输入森林节点数量:\n");
scanf("%d",&T.n);
//printf("请输入森林根节点节点位置:\n");
//scanf("%d",&T.r);//这里默认从零开始;
printf("请按层次输入节点的名称:\n");
char node_name;
for(int i=0;i<T.n;i++)
{
scanf("%c",&node_name);
while(node_name=='\n')
{
scanf("%c",&node_name);
}
T.nodes[i].data=node_name;
T.nodes[i].first=NULL;
}
/*printf("节点的名称依次为:\n");
for(int i=0;i<T.n;i++)
{
printf("%c\n",T.nodes[i].data);
} */
ENode *p;
for(int i=0;i<T.n;i++)
{
printf("请输入与%c相连的节点的下标,根据输入顺序而定,根节点为0 :\n",T.nodes[i].data);
//输入-1代表终止,没有相连的也输入-1
while(true)
{
p=(ENode*)malloc(sizeof(ENode));
scanf("%d",&p->child);
if(p->child==-1)
{
break;
}
p->next=T.nodes[i].first;
T.nodes[i].first=p;
}
}
return 0;
}
int printTree(TreeNode T)
{
for(int i=0;i<T.n;i++)
{
printf("%c->",T.nodes[i].data);
while(T.nodes[i].first)
{
printf("%d->",T.nodes[i].first->child);
T.nodes[i].first=T.nodes[i].first->next;
}
printf("NULL\n");
}
return 0;
}
int findChild(TreeNode T)
{
char node_name;
printf("请输入要寻找孩子节点的父节点的名称:\n");
scanf("%c",&node_name);
while(node_name=='\n')
{
scanf("%c",&node_name);
}
int tag;
for(int i=0;i<T.n;i++)
{
if(T.nodes[i].data==node_name)
{
tag=i;
break;
}
}
printf("%c->",T.nodes[tag].data);
while(T.nodes[tag].first)
{
printf("%d,%c->",T.nodes[tag].first->child,T.nodes[T.nodes[tag].first->child].data);
T.nodes[tag].first=T.nodes[tag].first->next;
}
printf("NULL\n");
return 0;
}
int findParent(TreeNode T)
{
char node_name;
printf("请输入要寻找父节点的孩子节点的名称:\n");
scanf("%c",&node_name);
while(node_name=='\n')
{
scanf("%c",&node_name);
}
int tag;
for(int i=0;i<T.n;i++)
{
if(T.nodes[i].data==node_name)
{
tag=i;
break;
}
}
for(int i=0;i<T.n;i++)
{
//printf("%c->",T.nodes[i].data);
while(T.nodes[i].first)
{
if(T.nodes[i].first->child==tag)
{
printf("%c\n",T.nodes[i].data);
}
//printf("%d->",T.nodes[i].first->child);
T.nodes[i].first=T.nodes[i].first->next;
}
//printf("NULL\n");
}
return 0;
}
int main()
{
TreeNode T;
createTree(T);
printTree(T);
findChild(T);
findParent(T);
return 0;
}