[問題] 二元搜尋樹插入節點的迴圈改遞迴

看板C_and_CPP作者 (阿湯)時間4年前 (2020/05/04 17:53), 4年前編輯推噓5(5019)
留言24則, 2人參與, 4年前最新討論串1/1
我要將二元搜尋樹的迴圈改成遞迴(改原程式的insert_node函數) 原程式如下: #include <stdlib.h> struct tree /* 樹的結構宣告 */ { int data; /* 節點資料 */ struct tree *left; /* 指向左子樹的指標 */ struct tree *right; /* 指向右子樹的指標 */ }; typedef struct tree treenode; /* 樹的結構新型態 */ typedef treenode *btree; /* 宣告樹節點指標型態 */ /* ---------------------------------------- */ /* 插入二元樹的節點 */ /* ---------------------------------------- */ btree insert_node(btree root,int value) { btree newnode; /* 樹根指標 */ btree current; /* 目前樹節點指標 */ btree back; /* 父節點指標 */ /* 建立新節點記憶體 */ newnode = ( btree ) malloc(sizeof(treenode)); newnode->data = value; /* 建立節點內容 */ newnode->left = NULL; /* 設定指標初值 */ newnode->right = NULL; /* 設定指標初值 */ if ( root == NULL ) /* 是否是根節點 */ { return newnode; /* 傳回新節點位置 */ } else { current = root; /* 保留目前樹指標 */ while ( current != NULL ) { back = current; /* 保留父節點指標 */ if ( current->data > value ) /* 比較節點值 */ current = current->left; /* 左子樹 */ else current = current->right; /* 右子樹 */ } if ( back->data > value ) /* 接起父子的鏈結 */ back->left = newnode; /* 左子樹 */ else back->right = newnode; /* 右子樹 */ } return root; /* 傳回樹根指標 */ } /* ---------------------------------------- */ /* 建立二元樹 */ /* ---------------------------------------- */ btree create_btree(int *data,int len) { btree root = NULL; /* 樹根指標 */ int i; for ( i = 0; i < len; i++ ) /* 用迴路建立樹狀結構 */ root = insert_node(root,data[i]); return root; } /* ---------------------------------------- */ /* 二元樹後序走訪 */ /* ---------------------------------------- */ void postorder(btree ptr) { if ( ptr != NULL ) /* 終止條件 */ { postorder(ptr->left); /* 左子樹 */ postorder(ptr->right); /* 右子樹 */ printf("[%2d]\n",ptr->data); /* 列印節點內容 */ } } /* ---------------------------------------- */ /* 主程式: 建立二元樹且用後序走訪列印出來. */ /* ---------------------------------------- */ void main() { btree root = NULL; /* 樹根指標 */ /* 二元樹節點資料 */ int data[9] = { 5, 6, 4, 8, 2, 3, 7, 1, 9 }; root = create_btree(data,9); /* 建立二元樹 */ printf("樹的節點內容 \n"); postorder(root); /* 後序走訪二元樹 */ } 後來我自己改成遞迴程式(改了insert_node函數)如下: #include <stdlib.h> #include <stdio.h> struct tree /* 樹的結構宣告 */ { int data; /* 節點資料 */ struct tree *left; /* 指向左子樹的指標 */ struct tree *right; /* 指向右子樹的指標 */ }; typedef struct tree treenode; /* 樹的結構新型態 */ typedef treenode *btree; /* 宣告樹節點指標型態 */ /* ---------------------------------------- */ /* 插入二元樹的節點 */ /* ---------------------------------------- */ btree insert_node(btree root,int value) { btree newnode; /* 樹根指標 */ btree current; /* 目前樹節點指標 */ btree back; /* 父節點指標 */ /* 建立新節點記憶體 */ newnode = ( btree ) malloc(sizeof(treenode)); newnode->data = value; /* 建立節點內容 */ newnode->left = NULL; /* 設定指標初值 */ newnode->right = NULL; /* 設定指標初值 */ current = root; if ( root == NULL ) /* 是否是根節點 */ { return newnode; /* 傳回新節點位置 */ } else if(current->data>value) { insert_node(current->left,value); return root; } else {; insert_node(current->right,value); } } /* ---------------------------------------- */ /* 建立二元樹 */ /* ---------------------------------------- */ btree create_btree(int *data,int len) { btree root = NULL; /* 樹根指標 */ int i; for ( i = 0; i < len; i++ ) /* 用迴路建立樹狀結構 */ root = insert_node(root,data[i]); return root; } /* ---------------------------------------- */ /* 二元樹後序走訪 */ /* ---------------------------------------- */ void postorder(btree ptr) { if ( ptr != NULL ) /* 終止條件 */ { postorder(ptr->left); /* 左子樹 */ postorder(ptr->right); /* 右子樹 */ printf("[%2d]\n",ptr->data); /* 列印節點內容 */ } } /* ---------------------------------------- */ /* 主程式: 建立二元樹且用後序走訪列印出來. */ /* ---------------------------------------- */ void main() { btree root = NULL; /* 樹根指標 */ /* 二元樹節點資料 */ int data[9] = { 5, 6, 4, 8, 2, 3, 7, 1, 9 }; root = create_btree(data,9); /* 建立二元樹 */ printf("樹的節點內容 \n"); postorder(root); /* 後序走訪二元樹 */ } 但改成遞迴後,程式結果不一樣 請問我哪裡錯了呢? 我搞了超久了 希望各位高手幫幫忙 拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託 拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託 拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託拜託 拜託拜託拜託拜託拜託拜託拜託拜託拜託..... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.19.41 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1588586024.A.B65.html

05/04 18:34, 4年前 , 1F
沒接上回傳的結點當然會失敗
05/04 18:34, 1F

05/04 18:37, 4年前 , 2F
你是用指標不是用參考,所以需要加上賦值
05/04 18:37, 2F
感謝你!但可能是我學得不好,是否要改寫insert_node(current->left,value)這句呢?我不知道這句要怎麼改才能有結果可以幫幫我嗎? ※ 編輯: cat99961 (114.42.19.41 臺灣), 05/04/2020 21:25:53

05/05 13:04, 4年前 , 3F
樓上正解,你改寫遞迴但你遞迴的部分怎麼會沒有處理r
05/05 13:04, 3F

05/05 13:04, 4年前 , 4F
eturn node呢?
05/05 13:04, 4F

05/05 17:24, 4年前 , 5F
current->left= insert_node(current->left,value) 這樣
05/05 17:24, 5F

05/05 18:35, 4年前 , 6F
稍微回一下大概
05/05 18:35, 6F

05/05 18:35, 4年前 , 7F
btree insert_node(btree root, int value)
05/05 18:35, 7F

05/05 18:35, 4年前 , 8F
{
05/05 18:35, 8F

05/05 18:35, 4年前 , 9F
if(NULL != root){
05/05 18:35, 9F

05/05 18:35, 4年前 , 10F
If(root->data > value)
05/05 18:35, 10F

05/05 18:35, 4年前 , 11F
root->left = insert_node(root->left
05/05 18:35, 11F

05/05 18:35, 4年前 , 12F
, value);
05/05 18:35, 12F

05/05 18:35, 4年前 , 13F
else
05/05 18:35, 13F

05/05 18:35, 4年前 , 14F
root->right = insert_node(root->rig
05/05 18:35, 14F

05/05 18:35, 4年前 , 15F
ht, value);
05/05 18:35, 15F

05/05 18:35, 4年前 , 16F
return root;
05/05 18:35, 16F

05/05 18:35, 4年前 , 17F
}
05/05 18:35, 17F

05/05 18:35, 4年前 , 18F
else{
05/05 18:35, 18F

05/05 18:35, 4年前 , 19F
btree newnode;
05/05 18:35, 19F

05/05 18:35, 4年前 , 20F
//以下大概
05/05 18:35, 20F

05/05 18:35, 4年前 , 21F
newnode = malloc()
05/05 18:35, 21F

05/05 18:35, 4年前 , 22F
return newnode;
05/05 18:35, 22F

05/05 18:35, 4年前 , 23F
}
05/05 18:35, 23F

05/05 18:35, 4年前 , 24F
}
05/05 18:35, 24F
太感謝了!!我做出來了@@~~太熱心了....弄了超久的...我要來好好地把我一些基礎給搞好 ※ 編輯: cat99961 (114.42.19.41 臺灣), 05/05/2020 23:39:30
文章代碼(AID): #1Uh-Oejb (C_and_CPP)