「ツリーの遍歴」の問題――C言語メニューの実現
二叉木の遍歴
ツリーはlson-rsonリンク方式で格納され、メニュー方式で機能タスクを設計し、完成する:ツリーを確立し、格納し、前順遍歴結果を出力し、中順遍歴結果を出力し、後順遍歴結果を出力し、左右のサブツリーを交換し、高さを統計し、その中で中で中順、後順の遍歴演算に対して非再帰方式を採用する.
完全なコード
参考資料
(読んだり見たりすることを強くお勧めします!)ツリーの構築方法のまとめ 【データ構造】詳細な説明-ツリー(P 3_ツリーの非再帰的遍歴方式)
ツリーはlson-rsonリンク方式で格納され、メニュー方式で機能タスクを設計し、完成する:ツリーを確立し、格納し、前順遍歴結果を出力し、中順遍歴結果を出力し、後順遍歴結果を出力し、左右のサブツリーを交換し、高さを統計し、その中で中で中順、後順の遍歴演算に対して非再帰方式を採用する.
完全なコード
#include
#include
typedef struct Node{
char data;
struct Node* left;
struct Node* right;
}Node;
//
Node* QandA_Build(int isRoot){
Node *p;
char ch,ch2;
if (isRoot)
printf(" : ");
scanf("%c", &ch);
ch2 = getchar();
if(ch == '#') p = NULL;
else{
isRoot = 0;
p = (Node*)malloc(sizeof(Node));
p->data = ch;
printf(" '%c' : ", p->data);
p->left = QandA_Build(isRoot);
printf(" '%c' : ", p->data);
p->right = QandA_Build(isRoot);
}
return p;
}
//
Node* PreOrder_Build(){
Node *p;
char ch;
scanf("%c", &ch);
if (ch == '#') p = NULL;
else{
p = (Node*)malloc(sizeof(Node));
p->data = ch;
p->left = PreOrder_Build();
p->right = PreOrder_Build();
}
return p;
}
// ( )
void PreOrder(Node* t){
if(!t)
return ;
else{
printf("%c",t->data);
PostOrder(t->left);
PostOrder(t->right);
}
}
// ( )
void InOrder(Node* t){
if(!t)
return ;
else{
InOrder(t->left);
printf("%c",t->data);
InOrder(t->right);
}
}
// ( )
void PostOrder(Node* t){
if(!t)
return ;
else{
PostOrder(t->left);
PostOrder(t->right);
printf("%c",t->data);
}
}
// ( )
void InOrderByStack(Node* t){
if (t == NULL)
return;
Node* stack[100];
int top = -1;
Node* p = t;
while ( top!=-1 || p ){
// ,
while(p){
top++;
stack[top] = p;
p = p->left;
}
// ,
if ( top!=-1 ){
p = stack[top];
top--;
printf("%c",p->data);
p = p->right;
}
}
}
// ( )
void PostOrderByStack(Node* t){
if (t == NULL)
return;
Node* stack[100];
int top = -1;
Node* pCur = t, *pLastVisit = NULL;
//
while (pCur){
top++;
stack[top] = pCur;
pCur = pCur->left;
}
while ( top!=-1 ){
// ,
pCur = stack[top];
top--;
// ,
if (pCur->right == NULL || pCur->right == pLastVisit){
printf("%c", pCur->data);
pLastVisit = pCur;
}
else{//
top++;
stack[top] = pCur;
pCur = pCur->right;
while (pCur){
top++;
stack[top] = pCur;
pCur = pCur->left;
}
}
}
printf("
");
}
//
void Exchange(Node* t){
Node *temp;
if(!t)
return ;
else{
temp = t->left;
t->left = t->right;
t->right = temp;
Exchange(t->left);
Exchange(t->right);
}
}
//
int Height(Node* t){
if(t==NULL)
return 0;
else if(t->left==NULL && t->right==NULL)
return 1;
else
{
int Hl,Hr;
Hl=Height(t->left);
Hr=Height(t->right);
if(Hl>Hr)
return Hl+1;
else
return Hr+1;
}
}
//
Node* BuildTree(){
printf("* , !( òωó)");
int select, flag = 0;
char ch;
Node* tree;
while(!flag){
printf("
* 1>
* 2> ");
printf("
* :");
scanf("%d", &select);
ch = getchar();
printf("
");
switch(select){
case 1:
printf(" ( '#')。
");
tree = QandA_Build(1);
printf("* !
");
flag = 1;
break;
case 2:
printf("* ( '#'):");
tree = PreOrder_Build();
printf("* !
");
flag = 1;
break;
default:
printf("* ! !
");
break;
}
}
return tree;
}
//
int main(){
int select;
Node *tree = BuildTree();
while(1){
printf("
******* ******");
printf("
***-----1> ------***");
printf("
***-----2> ------***");
printf("
***-----3> ------***");
printf("
***-----4> ------***");
printf("
***-----5> ----***");
printf("
***-----6> ----***");
printf("
***-----7> ----------***");
printf("
*******************************");
printf("
* :");
scanf("%d",&select);
printf("
");
switch(select){
case 1:
printf("* :");
PreOrder(tree);
printf("
");
break;
case 2:
printf("* :");
InOrderByStack(tree);
printf("
* ( ) :");
InOrder(tree);
printf("
");
break;
case 3:
printf("* :");
PostOrderByStack(tree);
printf("
* ( ) :");
PostOrder(tree);
printf("
");
break;
case 4:
Exchange(tree);
printf("* !
");
break;
case 5:
printf("* :%d
", Height(tree));
break;
case 6:
tree = BuildTree();
break;
case 7:
printf("* ! !");
return 0;
default:
printf("* ! !
");
break;
}
}
}
参考資料
(読んだり見たりすることを強くお勧めします!)ツリーの構築方法のまとめ 【データ構造】詳細な説明-ツリー(P 3_ツリーの非再帰的遍歴方式)