struct tree tree int n struct tree newtree
- 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
- Int sum(int a int n) int sum=0 i
- Typedef struct tree int info struct *left
- Typedef struct node
- Typedef struct tree int info
- Struct node int data struct node* next
- Interface calculator public int add(int a int b) class test
- Public void drawsquare(int x, int y, int len)
- Public int divide(int a int b)
- Int max(int x int y)
- Struct node *next
- Typedef struct tree int info
- C copy struct
- Struct sample int a=0
- Struct node int i float j
- Struct node int data
- Struct node int i float j
- Typedef struct in c
- Struct point int x y
- Struct point int x y
- Void swap(int a int b)
- 7팩토리얼
- Int f (int n)
- Interface myinterface int foo(int x)
- Const int arduino
- Int max int min c++
- Int main(int argc, char** argv)
- Int main() int num=4
- Int argc char argv
- 引線二元樹
- Node leaf
- H
- Typedef in structure
- Typedef list
- Struct file_operations
- I struct
- Typedef struct c
- Struct attribute packed
- Sembuf structure c
- Typedef struct node
- Struct stat
- Typedef
- Struct node *
- Bb kiu
- Tipe data struct
- C++ struct partial initialization
- Struct in c++
- Struct pim
- Declare a struct
- Seismo struct
- Miscdevice
- Pass by value parameter
- Struct em c
- Matlab getfield
- Typedef struct node
- Struct student char *name
- C# struct vs class
- Jenis jenis queue
- Struct student
- Racket struct
- Struct
- Typedef struct tag
- Clear struct
- C++ struct private members
- Typedef struct
- Struct dirent
- Struct
- Struct words meaning build