質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

3321閲覧

2分探索木を再起を用いずに中順(通りがけ順)で値を出力するプログラムを作成したいです。

apeirogon0813

総合スコア117

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2019/04/18 10:17

編集2019/04/18 11:44

前提・実現したいこと

2分探索木において小さい値から出力されるような関数print_nodes(struct node p)をスタックの関数
スタックに格納する関数 void push(struct node
p)
スタックから取り出しを行う関数 struct node *pop()
スタックが空であると1, 空でないときには0を返す関数 int stackempty()
を用いて再起を使わずに実装したいのですがやり方がわかりません。

尚、構造体は以下のを用いるつもりです

C

1struct node { 2int val; 3struct node *left; 4struct node *right; 5};

ご教授お願いいたします。

再帰関数を用いたプログラムは以下のように作成できました。

C

1void print_nodes(struct node *p) { 2if (p == null) return; 3print_nodes(p->left); 4printf("%d\n",p->val); 5print_nodes(p->right); 6}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/04/18 11:35

参考と確認の為, 再帰を使ったコードを追記して頂けますか.
apeirogon0813

2019/04/18 11:44

追記させていただきました。
guest

回答1

0

ベストアンサー

再帰版は教科書通りのようでしたので, 同様なコードを探したのですが直ぐには見つかりませんでしたので, テキトウに作成致しました.

C

1#include <stdio.h> 2 3struct node { 4 int val; 5 struct node *left; 6 struct node *right; 7}; 8 9struct node *stack[100]; 10int stack_i = 0; 11/*スタックに格納する関数*/ 12void push(struct node* p) { stack[stack_i++] = p; } 13/*スタックから取り出しを行う関数*/ 14struct node *pop() { return stack[--stack_i]; } 15/*スタックが空であると1, 空でないときには0を返す関数*/ 16int stackempty() { return (stack_i == 0 ? 1 : 0); } 17 18void inorder(struct node *p) { 19 while(p != NULL) { 20 push(p); 21 for(p = p->left; p == NULL && !stackempty(); p = p->right) { 22 p = pop(); 23 printf("%d\n", p->val); 24 } 25 } 26} 27 28int main() { 29 struct node nodes[8]; 30 31 nodes[0].val = 7; 32 nodes[0].left = &nodes[1]; 33 nodes[0].right = &nodes[6]; 34 35 nodes[1].val = 3; 36 nodes[1].left = &nodes[2]; 37 nodes[1].right = &nodes[3]; 38 39 nodes[2].val = 1; 40 nodes[2].left = NULL; 41 nodes[2].right = NULL; 42 43 nodes[3].val = 4; 44 nodes[3].left = NULL; 45 nodes[3].right = &nodes[4]; 46 47 nodes[4].val = 6; 48 nodes[4].left = &nodes[5]; 49 nodes[4].right = NULL; 50 51 nodes[5].val = 5; 52 nodes[5].left = NULL; 53 nodes[5].right = NULL; 54 55 nodes[6].val = 10; 56 nodes[6].left = &nodes[7]; 57 nodes[6].right = NULL; 58 59 nodes[7].val = 8; 60 nodes[7].left = NULL; 61 nodes[7].right = NULL; 62 63 inorder(nodes); 64 65 return 0; 66}

投稿2019/04/18 13:24

編集2019/04/18 17:02
jimbe

総合スコア12632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apeirogon0813

2019/04/21 16:30

回答ありがとうございます。素晴らしいコードです!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問