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

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

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

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

Q&A

解決済

2回答

4367閲覧

[C言語]二分木中に挿入されたデータを昇順に表示する関数の実装がしたい

yastem

総合スコア2

C

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

0グッド

0クリップ

投稿2020/11/20 16:56

編集2020/11/21 08:30

C言語の学習中です。
題の通り、二分木中に挿入されたデータを昇順に表示する関数を実装したいのですが、やりかたで悩んでいます。
主に関数ファイル内のvoid tree_print(tree_node_t *n)に変更を加えることで、正常に動作させたいと思っています。
プログラムは以下の通りです。

mainファイル(tree9test.c)

include <stdio.h>
include "tree.h"

int main (void)
{
tree_node_t *root = NULL;

for (;;) {
int data;
fprintf(stderr, "input = ");
if (scanf("%d", &data)==EOF) { break; }
root = tree_insert_uniq(root, data);
printf("[");
tree_print(root);
printf(" ]\n");
}

tree_delete(root);
return 0;
}

hファイル(tree.h)

typedef struct tree_node_s {
struct tree_node_s *left;
struct tree_node_s *right;
int data;
} tree_node_t;

void tree_print(tree_node_t root);
tree_node_t
tree_insert(tree_node_t root, int v);
tree_node_t
tree_insert_uniq(tree_node_t root, int v);
tree_node_t
tree_find(tree_node_t *root, int v);
void tree_delete(tree_node_t *root);

# 関数ファイル(tree.c)
include <stdio.h>
include <stdlib.h>
include <assert.h>
include "tree.h"

static tree_node_t* create_node(int val);

static tree_node_t* create_node(int val)
/* 値 val を保持する新しい節点を作成し, その節点へのポインタを返す */
{
tree_node_t new_node;
new_node = (tree_node_t
) malloc(sizeof(tree_node_t));
if (new_node == NULL) {
fprintf(stderr, "節点の割当てに失敗しました\n");
exit(1);
}
new_node->data = val;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}

tree_node_t* tree_insert_uniq(tree_node_t n, int val)
/
n を根とする二分木に val (の節点) を挿入する /
{
/
val と同じ値を持つ節点が存在すれば挿入しないようにする */

if (n==NULL) { n = create_node(val); } else if (val < n->data) { n->left = tree_insert_uniq(n->left, val); } else if (val > n->data) { n->right = tree_insert_uniq(n->right, val); } else{;} return n;

}

void tree_print(tree_node_t n)
/
二分木の内容を表示する /
{
if (n!=NULL) {
/
値の昇順に表示されるようにしたい */

printf(" %d", n->data); tree_print(n->left); tree_print(n->right); }

}

tree_node_t* tree_find(tree_node_t n, int val)
/
*n を根とする二分木中に値が val の節点を探す
見つかればその節点のポインタを, なければ NULL を返す */
{
}

void tree_delete(tree_node_t n)
/
二分木のデータを解放する */
{
if (n!=NULL) {
tree_delete(n->left);
tree_delete(n->right);
free(n);
}
}

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

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

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

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

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

ayousanz

2020/11/20 16:58

C言語とC#は別なので同じカテゴリにしない方がいいと思います コードは一定のルールで書くとシンタックスハイライトになるので,そちらで記載してください
退会済みユーザー

退会済みユーザー

2020/11/20 23:27

C# のタグは削除願います。
yastem

2020/11/21 08:32

了解しました。
guest

回答2

0

ベストアンサー

まずは、Wikipediaにある木構造の走査法の説明を参照してください。
今のソースだと、こちらにある「行きがけ順」となっていますが、
2分探索木にてソートされた順序で走査したいなら「通りがけ順」にする必要があります。

投稿2020/11/20 21:20

actorbug

総合スコア2224

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

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

yastem

2020/11/22 07:39

書いてある通りにしたらできました。まさかwikiが参考になるとは。ありがとうございます。
guest

0

C

1printf(" %d", n->data); 2tree_print(n->left); 3tree_print(n->right);

C

1tree_print(n->left); 2printf(" %d", n->data); 3tree_print(n->right);

にするだけでは?

投稿2020/11/21 14:00

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問