作者oohay (五黑)
看板Programming
标题Re: [问题] class
时间Sat Dec 22 18:55:37 2007
问题的确出在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
1F:推 ntouckcm:谢谢 我再想想看 感谢你解答我的疑惑~140.121.219.142 12/22 20:01