struct tree tree int n struct tree newtree

  • Slides: 67
Download presentation

struct tree *tree( int n ) { struct tree *newtree; int x, nl, nr;

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 {

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(

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(

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 (

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 (

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 (

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 (

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 (

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 (

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 (

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 (

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 (

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 (

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(

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(

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(

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(

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(

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(

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(

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(

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(

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 {

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 {

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 {

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 {

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 {

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 {

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 {

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 {

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 {

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 {

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 {

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 {

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 {

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

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)

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;

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;

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)

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