struct tree tree int n struct tree newtree









































![int a[] = { 1, 2, 3, 4, 5, 6, EOD}; root int main(void) int a[] = { 1, 2, 3, 4, 5, 6, EOD}; root int main(void)](https://slidetodoc.com/presentation_image_h/33c0bb9a2977d51569b0dde03e043c46/image-42.jpg)
























![int a[] = { 1, 2, 3, 4, 5, 6, EOD}; root int main(void) int a[] = { 1, 2, 3, 4, 5, 6, EOD}; root int main(void)](https://slidetodoc.com/presentation_image_h/33c0bb9a2977d51569b0dde03e043c46/image-67.jpg)
- Slides: 67
struct tree *tree( int n ) { struct tree *newtree; int x, nl, nr; if ( n==0 ) else { } } return( NULL ); 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)
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 ); } 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 ); } 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 ); } 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 ); } 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 ); } 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 ); } tree(0) : 呼出 4 NULL 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 ); } tree(0) : 呼出 4 NULL 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 ); } 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 ); } tree(0) : 呼出 5 L L NU 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 ); } tree(0) : 呼出 5 L L NU 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 ); } 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 ); } 1 2 3 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 ); } 1 2 3 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 ); } 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
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 ); } 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 ); } 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 ); } tree(0) : 呼出 7 L L U 1 N 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
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 ); } tree(1) : 呼出 6 L NUL 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
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 ); } 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 ); } 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 ); } 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 ); } 1 2 3 NU LL 4 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
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
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
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
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 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 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 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 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 ); } 1 2 5 3 NU LL 4 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 ); } 1 2 5 NU LL 3 NU LL 4 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 ); } 1 2 5 NU LL 3 NU LL 4 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 ); } 1 2 5 NU LL 3 NU LL 4 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 ); } 1 2 5 NU LL 3 NU LL 4 NU LL 6 NU LL
root 1 2 5 NU LL 3 NU LL 4 NU LL 6 NU LL
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 6 NU LL
struct tree *tree( int n ) 呼出 4: 呼出 3からn=0 { struct tree *newtree; int x, nl, nr; n=0 で呼び出し if ( n==0 ) else { } } return( NULL ); で呼び出された → これより下に木はない 呼出 3にNULL を返す。 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 ) 呼出 1: mainからn=6 で呼び出された { struct tree *newtree; int x, nl, nr; n=6 で呼び出し if ( n==0 ) 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 ); newtree 1 } } return( NULL ); 2 5 NU LL 3 NU LL 4 NU LL 6 NU LL → 左部分木のノード数 nl = 3 右部分木のノード数 nr = 6 -3 -1 = 2 この木の根: 1個 NU LL 呼出 1: 完了 mainに部分木を返す
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 6 NU LL