Re: [問題] class

看板Programming作者 (五黑)時間18年前 (2007/12/22 18:55), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
問題的確出在find函式,因為find不一定找到你本來想找的, 所以樹就給你亂insert. 不信看下面: ※ 引述《ntouckcm (知足常樂)》之銘言: : node* tree::findNode(element key) : { : node *p = root; : p=find(p,key); if (p!=0) cout << "Found: " << p->data << endl; : count=0; : return p; : } (略) : node* tree::find(node *p,element key) : { : if(p!=0) : { : if(p->left!=0&&p->right!=0) : { : q=p; : find(p->left, key); //找左邊,很好,但找了左邊就放著不用,也沒好處 : } : if(strcmp(p->data,key)==0) : { : count++; : } : else{ //看來這裏土法鍊鋼做出找左邊與找右邊的動作 //可惜,你只考慮了樹根,沒有考慮其他子樹. : if((count==1)&&(strcmp(q->left->data,key)==0)) : { : return q->left; : } : else : { : if(p->left!=0&&p->right!=0) : find(p->right, key); //這個也是,名目上找了右邊, //卻也放著不使用. : } : } //這裏是第二個土法練鋼處 : if(count==1){ : return q->right; : } : } : } (略) 主程式: int main(){ FILE *fp; char buffer[100]; char command[100]; char data1[100]; char data2[100]; char data3[100]; tree T; if((fp = fopen("testfile11.txt", "rt"))==NULL){ cout<<"File could not opened\n"; } else{ /* while(!feof(fp)){ fgets(buffer, sizeof(buffer), fp); sscanf(buffer, "%s%s%s%s",command,data1,data2,data3); if(strcmp(command,"I")==0){ T.insert(data1,data2,data3); T.traverse(IN_ORDER); cout << endl; } }*/ T.insert("A","B","C"); T.insert("B","E","F"); T.insert("F","G","H"); T.traverse(IN_ORDER); T.findNode("B"); //這裏在樹裏找 B 唷,看一下輸出會是什麼 } } 輸出: Found: B Found: F Node E at level 2 Node B at level 1 Node G at level 3 Node F at level 2 Node H at level 3 Node A at level 0 Node C at level 1 Found: F 看,traverse之後所找的那次, 本來要找 "B", 找出來卻印出 "F". 原因是tree::find函式沒寫對, 有時候傳回答案, 有時候沒傳回答案, 而且即使傳回答案, 答案也不正確. tree:find還要再想想,善用遞迴處理,因為二元樹有可遞迴處理的結構. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.160.110.103

12/22 20:01, , 1F
謝謝 我再想想看 感謝你解答我的疑惑~
12/22 20:01, 1F
文章代碼(AID): #17REqgEH (Programming)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
1
1
1
1
18年前, 12/21
文章代碼(AID): #17REqgEH (Programming)