アルゴリズムとデータ構造 補足資料
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)呼出
1: tree(6)呼出
1が完了して、
処理が戻ってきた時(実行後)のイメージ
int a[] = { 1, 2, 3, 4, 5, 6, EOD};
int main(void) {
struct tree *root;
root = tree( 6 );
略 }
root
ノード数 6 ランス木の完全バ
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 );
} }
呼出 1: main から n=6 で呼び出された
n=6 で呼び出し
→ 左部分木のノード数 nl = 3
右部分木のノード数 nr = 6-3-1 = 2 この木の根 : 1 個
newtree
1
ノード数3の 完全バランス
呼出2: tree(3)
呼出2 が完了して、
処理が戻ってきた時(実行後)のイメージ
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
3
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
3
tree(0) : 呼出 4
if ( n==0 ) 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 );
}
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
3
tree(0) : 呼出 4
if ( n==0 ) 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 );
}
newtree
NULL
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
N3
tree(0) : 呼出 4
if ( n==0 ) 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 );
}
newtree
NULL
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
N3
U L L
tree(0) : 呼出 5
if ( n==0 ) 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 );
}
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
N3
tree(0) : 呼出 5
if ( n==0 ) 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 );
}
newtree
NULL
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
N3
U L L
N U L L
tree(0) : 呼出 5
if ( n==0 ) 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 );
}
newtree
NULL
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
N3 N
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
tree(1) : 呼出 3
if ( n==0 ) 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 );
}
newtree
N3
U L L
N U L L
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3 N
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3
U L L
N U L L
tree(1) : 呼出 6
if ( n==0 ) 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 );
}
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3 N
tree(1) : 呼出 6
if ( n==0 ) 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 );
}
newtree
4
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3
U L L
N U L L
tree(1) : 呼出 6
if ( n==0 ) 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 );
}
newtree
N4
U L L
tree(0) : 呼出 7
if ( n==0 ) 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 );
}
newtree
NULL
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3 N
tree(1) : 呼出 6
if ( n==0 ) 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 );
}
newtree
N4 N
tree(0) : 呼出 8
if ( n==0 ) 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 );
newtree
UN LL
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3
U L L
N U L L
tree(1) : 呼出 6
if ( n==0 ) 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 );
}
newtree
N4
U L L
N U L L
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3 N N4 N
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3
U L L
N U L L
N4
U L L
N U L L
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
tree(3) : 呼出 2
if ( n==0 ) 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 );
}
newtree
2
N3 N N4 N
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
2
N3
U L L
N U L L
N4
U L L
N U L L
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
2
N3 N N4 N
tree(2) : 呼出 9
if ( n==0 ) 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 );
}
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
2
N3
U L L
N U L L
N4
U L L
N U L L
tree(2) : 呼出 9
if ( n==0 ) 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 );
}
newtree
5
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
2
N3 N N4 N
tree(2) : 呼出 9
if ( n==0 ) 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 );
}
newtree
5
tree(1) : 呼出10
if ( n==0 ) 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 );
}
newtree
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
2
N3
U L L
N U L L
N4
U L L
N U L L
tree(2) : 呼出 9
if ( n==0 ) 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 );
}
newtree
5
tree(1) : 呼出10
if ( n==0 ) 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 );
}
newtree
6
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
2
N3 N N4 N
tree(2) : 呼出 9
if ( n==0 ) 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 );
}
newtree
5
tree(1) : 呼出10
if ( n==0 ) 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 );
}
newtree
N6
tree(6) : 呼出 1
if ( n==0 ) 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
newtree
2
N3
U L L
N U L L
N4
U L L
N U L L
tree(2) : 呼出 9
if ( n==0 ) 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 );
}
newtree
5
tree(1) : 呼出10
if ( n==0 ) 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 );
}
newtree
N6
U L L
N U L L