Re: [問題] 二元樹插入節點

看板C_and_CPP (C/C++)作者 (Lizst)時間16年前 (2010/06/14 09:47), 編輯推噓3(3011)
留言14則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《Lizstlin (Lizst)》之銘言: : 遇到的問題: : 插入節點的基本架構已經寫好了, 這是我拙劣的code : http://gist.github.com/435574 : input檔的內容如下: : 1,10,0,0 : 2,20,1,0,3,40,1,1 : 4,30,2,0,5,50,3,0,6,60,3,1 : 7,70,5,1 : 這四行數字代表右圖的tree : 每行代表tree的每個level : 每4個數代表一個node : 第一個數是id,第二個數是data,第三個數是parent的id : 第四個數代表自己是左子樹(0)或是右子樹(1) : 比方node 6, id是6,data是60,parent id是3,是右子樹 : 所以在input檔裡的第三行(level 3)的第四組數字就是6,60,3,1 : 不過, 小弟不知道應該加什麼條件才能在正確的地方插入節點 : 目前得到的樹狀圖就是個剪刀刃形狀 : (是有想到利用parent 的id 來做插入, 但是不知道如何指向父節點) : 希望得到的的樹狀圖如下 : 10 : / \ : 20 40 : / / \ : 30 50 60 : \ : 70 : 插入節點的順序是 10, 20, 40, 30, 50, 60 ,70 : 這是錯誤的執行結果: : prefix:10 20 30 50 40 60 70 : infix:50 30 20 10 40 60 70 : postfix:50 30 20 70 60 40 10 : 希望得到的正確結果: : prefix:10 20 30 40 50 70 60 : infix:30 20 10 50 70 40 60 : postfix:30 20 70 50 60 40 10 : 希望高人指點, 謝謝^^" 不好意思, 又來請教各位了. 我修改之後變這樣 class BinaryTree { TreeNode *root; void showInOrder(TreeNode *); void showPreOrder(TreeNode *); void showPostOrder(TreeNode *); public: TreeNode *StoreNode[150]; BinaryTree() { root = NULL; } void insertNode(int, int, int, int); void coutInOrder() { showInOrder(root); } void coutPreOrder() { showPreOrder(root); } void coutPostOrder() { showPostOrder(root); } }; void BinaryTree::insertNode (int id, int num, int parent, int LR) { TreeNode *NewNode = new TreeNode; TreeNode *TempNode; NewNode->left = NewNode->right = NULL; NewNode->data = num; if (root == NULL) { root = NewNode; StoreNode[0] = NewNode; } else { int i = id; while (i) { if (i != parent) { i--; } else { TempNode = StoreNode[i-1]; break; } } while (TempNode) { if (LR == 0) { if (TempNode->left) { TempNode = TempNode->left; } else { TempNode->left = NewNode; StoreNode[id-1]->left = NewNode; break; } } else if (LR == 1) { if(TempNode->right) { TempNode = TempNode->right; } else { TempNode->right = NewNode; StoreNode[id-1]->right = NewNode; break; } } } } } 但是執行的時候會爆掉 ~"~ 不知道哪裡出問題了, 希望有人可以替我解答 謝謝. 感激不盡 T~T -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.202.31

06/14 09:48, , 1F
編譯的時候會爆掉 <== 請詳細說明你的爆點是什麼吧 XD
06/14 09:48, 1F

06/14 09:55, , 2F
應該是執行的時候會爆掉吧 0.0
06/14 09:55, 2F
※ 編輯: Lizstlin 來自: 140.115.189.100 (06/14 13:14)

06/14 13:15, , 3F
sorry, 打錯了~"~ 就是開啟之後系統就說沒回應~"~
06/14 13:15, 3F

06/14 13:31, , 4F
陣列 StoreNode 沒有初始化, 類似像 StoreNode[?] =
06/14 13:31, 4F

06/14 13:32, , 5F
TempNode; 之類的程式碼, 就直接用 -> 運算子, 造成存
06/14 13:32, 5F

06/14 13:32, , 6F
取違規
06/14 13:32, 6F

06/14 13:40, , 7F
while (i) 那邊..為啥不直接TempNode = StoreNode[parent
06/14 13:40, 7F

06/14 13:41, , 8F
- 1];就好啊? 我看那段是多餘的不是嗎?
06/14 13:41, 8F

06/14 13:43, , 9F
那個迴圈看來是要做搜尋的功能, 不過原po沒寫出來
06/14 13:43, 9F

06/14 13:56, , 10F
喔喔...
06/14 13:56, 10F

06/14 13:57, , 11F
其實如果不考慮效率問題, 一直遞迴下去找會比較好寫
06/14 13:57, 11F

06/14 13:58, , 12F

06/14 14:11, , 13F
你可能還需要一個重載的版本
06/14 14:11, 13F

06/16 18:59, , 14F
嗯!寫出來了, 多謝指點 ^^
06/16 18:59, 14F
文章代碼(AID): #1C5OeVYf (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1C5OeVYf (C_and_CPP)