スライド 1

アルゴリズムとデータ構造
補足資料12-3
「サンプルプログラムtreeop1.c」
横浜国立大学
理工学部
数物・電子情報系学科
富井尚志
struct tree *tree( int n )
{
struct tree *newtree;
int x, nl, nr;
if ( n==0 )
return( NULL );
else {
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
ノード数nの完全バランス木を構成し、
その木へのポインタを返す関数 tree(n)
int a[] = { 1, 2, 3, 4, 5, 6, EOD};
root
int main(void)
{
struct tree *root;
root = tree( 6 );
ノード数6
の完全バラ
ンス木
略
}
呼出1: tree(6)
呼出1 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出1: mainからn=6 で呼び出された
{
struct tree *newtree;
int x, nl, nr;
n=6 で呼び出し
if ( n==0 )
return( NULL );
else {
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
1
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
呼出2: tree(3)
ノード数
3の完全
バランス
木
呼出2 が完了して、
処理が戻ってきた時(実行後)のイメージ
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(0) : 呼出4
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(0) : 呼出4
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(0) : 呼出4
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(0) : 呼出5
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(0) : 呼出5
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(0) : 呼出5
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
tree(1) : 呼出3
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出6
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出6
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
4
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出6
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
tree(0) : 呼出7
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
2
3
NU
LL
4
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出6
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
tree(0) : 呼出8
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
2
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出6
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
tree(3) : 呼出2
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
5
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出10
1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
2
5
3
NU
LL
4
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出10
1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
2
5
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出10
1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
2
5
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出10
1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
2
5
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(1) : 呼出10
1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
2
5
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
5
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
5
NU
LL
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
tree(2) : 呼出9
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
5
NU
LL
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
5
NU
LL
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
tree(6) : 呼出1
if ( n==0 )
newtree
return( NULL );
else {
nl = n/2; nr = n-nl-1;
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
1
2
5
NU
LL
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
root
1
2
5
NU
LL
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
int a[] = { 1, 2, 3, 4, 5, 6, EOD};
root
int main(void)
{
struct tree *root;
root = tree( 6 );
ノード数6
の完全バラ
ンス木
略
}
呼出1: tree(6)
呼出1 が完了して、
処理が戻ってきた時(実行後)のイメージ
int a[] = { 1, 2, 3, 4, 5, 6, EOD};
root
int main(void)
{
struct tree *root;
1
2
root = tree( 6 );
NU
LL
略
}
5
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
詳細トレース
int a[] = { 1, 2, 3, 4, 5, 6, EOD};
root
int main(void)
{
struct tree *root;
root = tree( 6 );
ノード数6
の完全バラ
ンス木
略
}
呼出1: tree(6)
呼出1 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出1: mainからn=6 で呼び出された
{
struct tree *newtree;
int x, nl, nr;
n=6 で呼び出し
if ( n==0 )
return( NULL );
else {
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
1
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
呼出2: tree(3)
ノード数
3の完全
バランス
木
呼出2 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出2: 呼出1からn=3
{
struct tree *newtree;
int x, nl, nr;
n=3 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 1
右部分木のノード数 nr = 3-1-1 = 1
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
2
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
呼出3: tree(1)
ノード数
1の完全
バランス
木
呼出3 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出3: 呼出2からn=1
{
struct tree *newtree;
int x, nl, nr;
n=1 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 0
右部分木のノード数 nr = 1-0-1 = 0
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
3
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
呼出4: tree(0)
ノード数
0の完全
バランス
木
呼出4 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出4: 呼出3からn=0
{
struct tree *newtree;
int x, nl, nr;
n=0 で呼び出し
if ( n==0 )
return( NULL );
で呼び出された
→ これより下に木はない
呼出3にNULL を返す。
else {
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
struct tree *tree( int n )
呼出3: 呼出2からn=1
{
struct tree *newtree;
int x, nl, nr;
n=1 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 0
右部分木のノード数 nr = 1-0-1 = 0
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
3
}
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
NU
LL
}
呼出4: tree(0)
呼出4 が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出3: 呼出2からn=1
{
struct tree *newtree;
int x, nl, nr;
n=1 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 0
右部分木のノード数 nr = 1-0-1 = 0
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
newtree
3
}
NU
LL
NU
LL
}
呼出5: tree(0)
呼出5 が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出3: 呼出2からn=1
{
struct tree *newtree;
int x, nl, nr;
n=1 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 0
右部分木のノード数 nr = 1-0-1 = 0
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
呼出2に、ポインタ newtreeの値を返す。
}
newtree
すなわち、
3
NU
LL
NU
LL
この部分木が返される。
struct tree *tree( int n )
呼出2: 呼出1からn=3
{
struct tree *newtree;
int x, nl, nr;
n=3 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 1
右部分木のノード数 nr = 3-1-1 = 1
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
2
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
呼出3: tree(1)
ノード数
の完全
バランス
木
呼出3 が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出2: 呼出1からn=3
{
struct tree *newtree;
int x, nl, nr;
n=3 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 1
右部分木のノード数 nr = 3-1-1 = 1
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
2
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
3
NU
LL
NU
LL
呼出3: tree(1)
呼出3 が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出2: 呼出1からn=3
{
struct tree *newtree;
int x, nl, nr;
n=3 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 1
右部分木のノード数 nr = 3-1-1 = 1
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
2
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
3
NU
LL
呼出6: tree(1)
NU
LL
ノード数
1の完全
バランス
木
呼出6 が完了して、
処理が戻ってきた時のイメージ
struct tree *tree( int n )
呼出6: 呼出2からn=1
{
struct tree *newtree;
int x, nl, nr;
n=1 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 0
右部分木のノード数 nr = 1-0-1 = 0
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
4
}
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
NU
LL
}
呼出7: tree(0)
呼出7が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出6: 呼出2からn=1
{
struct tree *newtree;
int x, nl, nr;
n=1 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 0
右部分木のノード数 nr = 1-0-1 = 0
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
newtree
4
}
NU
LL
NU
LL
}
呼出8: tree(0)
呼出8が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出6: 呼出2からn=1
{
struct tree *newtree;
int x, nl, nr;
n=1 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 0
右部分木のノード数 nr = 1-0-1 = 0
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
newtree
呼出6完了
この部分木を呼出2に返す
4
NU
LL
NU
LL
struct tree *tree( int n )
呼出2: 呼出1からn=3
{
struct tree *newtree;
int x, nl, nr;
n=3 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 1
右部分木のノード数 nr = 3-1-1 = 1
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
2
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
3
NU
LL
呼出6: tree(1)
NU
LL
ノード数
1の完全
バランス
木
呼出6 が完了して、
処理が戻ってきた時のイメージ
struct tree *tree( int n )
呼出2: 呼出1からn=3
{
struct tree *newtree;
int x, nl, nr;
n=3 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 1
右部分木のノード数 nr = 3-1-1 = 1
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
2
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
3
NU
LL
4
NU
LL
NU
LL
NU
LL
呼出6: tree(1)
呼出6 が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出2: 呼出1からn=3
{
struct tree *newtree;
int x, nl, nr;
n=3 で呼び出し
if ( n==0 )
return( NULL );
else {
で呼び出された
→ 左部分木のノード数 nl = 1
右部分木のノード数 nr = 3-1-1 = 1
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
newtree
}
呼出2: 完了
2
この部分木を呼出1に返す
3
NU
LL
4
NU
LL
NU
LL
NU
LL
struct tree *tree( int n )
呼出1: mainからn=6 で呼び出された
{
struct tree *newtree;
int x, nl, nr;
n=6 で呼び出し
if ( n==0 )
return( NULL );
else {
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
1
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
呼出2: tree(3)
ノード数
3の完全
バランス
木
呼出2 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出1: mainからn=6 で呼び出された
{
struct tree *newtree;
int x, nl, nr;
n=6 で呼び出し
if ( n==0 )
return( NULL );
else {
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
1
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
2
呼出2: tree(3)
3
NU
LL
4
NU
LL
NU
LL
NU
LL
呼出2 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出1: mainからn=6 で呼び出された
{
struct tree *newtree;
int x, nl, nr;
n=6 で呼び出し
if ( n==0 )
return( NULL );
else {
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree
1
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
}
}
2
呼出9: tree(2)
3
NU
LL
4
NU
LL
NU
LL
NU
LL
ノード数
2の完全
バランス
木
呼出9 が完了して、
処理が戻ってきた時(実行後)のイメージ
struct tree *tree( int n )
呼出1: mainからn=6 で呼び出された
{
struct tree *newtree;
int x, nl, nr;
n=6 で呼び出し
if ( n==0 )
return( NULL );
else {
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
newtree
1
}
}
2
5
NU
LL
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
呼出9: tree(2)
略
呼出9 が完了して、
処理が戻ってきた
struct tree *tree( int n )
呼出1: mainからn=6 で呼び出された
{
struct tree *newtree;
int x, nl, nr;
n=6 で呼び出し
if ( n==0 )
return( NULL );
else {
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2
この木の根: 1個
nl = n/2; nr = n-nl-1;
/* 完全バランス木では左右の部分木の節点数の差は高々1 */
newtree = (struct tree *)malloc(sizeof(struct tree));
newtree->key = get_data( );
newtree->left = tree( nl ); /* 再帰的に左部分木を生成 */
newtree->right = tree( nr ); /* 再帰的に右部分木を生成 */
return( newtree );
newtree
1
}
}
2
呼出1: 完了
5
NU
LL
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL
mainに部分木を返す
int a[] = { 1, 2, 3, 4, 5, 6, EOD};
root
int main(void)
{
struct tree *root;
root = tree( 6 );
ノード数6
の完全バラ
ンス木
略
}
呼出1: tree(6)
呼出1 が完了して、
処理が戻ってきた時(実行後)のイメージ
int a[] = { 1, 2, 3, 4, 5, 6, EOD};
root
int main(void)
{
struct tree *root;
1
2
root = tree( 6 );
NU
LL
略
}
5
3
NU
LL
4
NU
LL
NU
LL
6
NU
LL
NU
LL
NU
LL