Re: [問題] class
問題的確出在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
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章