2012-02-12 89 views
-1

任何人都可以解釋爲什麼我在這裏得到兩次輸出?爲什麼在這個樹程序中我得到了兩次輸出?

# include<iostream> 
# include<conio.h> 
# include <stdio.h> 

using namespace std; 

struct tree 
{ 
    int data; 
    struct tree * left; 
    struct tree * right; 
}; 

struct tree * insert(struct tree * root,int value) 
{ 
    if (root==NULL) 
    { 
     struct tree * node= (struct tree *)malloc(sizeof(struct tree)); 
     node->data=value; 
     node->right=NULL; 
     node->left=NULL; 
     return node; 
    } 
    else if(root->data > value) 
     root->left=insert(root->left,value); 
    else 
     root->right=insert(root->right,value); 
} 

int same_tree(struct tree * root1, struct tree* root2) 
{ 
    if((root1==NULL && root2!=NULL) || (root1!=NULL && root2==NULL)) 
    { 
     cout << " tree are not equal \n"; 
     return -1; 
    } 
    if(root1 && root2) 
    { 
     same_tree(root1->left,root2->left); 
     if(root1->data!=root2->data) 
     { 
     cout << "tree not equal \n"; 
     return -1;       
     } 
     same_tree(root1->right,root2->right); 
    } 
} 

int main() 
{ 
    struct tree * root=NULL; 
    root= insert(root,8); 
    insert(root,6); 
    insert(root,7); 
    insert(root,5); 
    insert(root,1); 
    insert(root,20); 
    insert(root,15); 
    struct tree * root2=NULL; 
    root2= insert(root2,8); 
    insert(root2,6); 
    insert(root2,7); 
    insert(root2,5); 
    insert(root2,1); 
    insert(root2,20); 
    insert(root2,18); 
    int j= same_tree(root,root2); 
    if(j==-1) 
     cout << " tree not eqqual \n"; 
    else 
     cout << "tree are equal\n"; 
    getch(); 
    return 0; 
} 

編寫該程序是爲了比較兩棵樹是否相同(在它們包含的同一層次結構和數據中)。我在這裏比較的兩棵樹是從main(root和root2)傳入的。 如果有相同的樹,我得到一次「樹相等」的O/O。但如果樹不相等,我得到一個o/p「tre不相等」,並在下一行中作爲「樹相等」。我無法解釋爲什麼?我編寫了整個程序,以便任何人都可以複製粘貼並在系統上運行它。我想問題在於same_tree的遞歸調用的地方,但位置和原因是什麼我沒有得到

+0

這是爲什麼標籤的Java? – 2012-02-12 18:42:49

+1

這是什麼*語言* FrankenC++? – 2012-02-12 18:44:38

+0

@Luchian對不起mea culpa ... untagged它 – Invictus 2012-02-12 18:45:10

回答

1

比較樹時,如果左節點不同,則只返回-1(錯誤)。你只是忽略了正確的節點。另外,如果你的樹只在右邊不同,你的same_tree根本不會返回值。我真的很驚訝這個編譯。

如果你看看你的same_tree觀察,你會發現它檢查是否只放過一個/右爲空,然後如果不爲空。但是,如果它們都是無效的,那麼就只能通過了。您也忽略了許多點的返回值。

說你有兩個根,每個價值5,其中一人已進入same_tree你會比較這將左派面前說是不同的,當離開7,而其他已經離開8.現在。然而,返回值被忽略,你會繼續比較根值(都是5),因爲它們是相同的,你不會返回錯誤代碼,你的主要方法會認爲每件事情都很好,並且打印出來,他們是平等的。

+0

是的,這是真的,可能是我所做的不是一個好的編程習慣。但是我確定它在不相等的情況下返回-1。並在此基礎上進行主要檢查。但我仍然不確定爲什麼我得到兩個O/P。 – Invictus 2012-02-12 19:04:43

+1

當它們不相等時,您應該得到兩個輸出,在same_tree和main()中都有輸出。 – 2012-02-12 19:14:31

+0

非常感謝。如您在評論中提到的那樣投票並接受了您找到錯誤的答案。 – Invictus 2012-02-12 19:22:18

0

你在你的插入方法缺少return語句(驚喜呢編譯):

struct tree * insert(struct tree * root,int value) 
{ 
    if (root==NULL) 
    { 
     struct tree * node= (struct tree *)malloc(sizeof(struct tree)); 
     node->data=value; 
     node->right=NULL; 
     node->left=NULL; 
     return node; 
    } 
    else if(root->data > value) 
     root->left=insert(root->left,value); 
    else 
     root->right=insert(root->right,value); 

    return root; 
} 
+0

那肯定不是問題。要插入的節點將始終從if(root == NULL)返回,儘管我沒有捕獲它們,除了我想作爲root的第一個值。如果你用你的return語句編輯我的程序,它不會在O/P中產生任何影響,我已經提到了 – Invictus 2012-02-12 18:51:22

+0

而且還遺漏了same_tree中的返回值。 – alexander 2012-02-12 18:53:47

+0

通過爲我加了,你是在摧毀有超過3個節點的任何樹,作爲原始根節點的左/右指針將被設置爲垃圾(或NULL,如果你的編譯器是好的),而不會返回'root'第四次插入。這就是爲什麼你的樹評估是平等的,因爲當你到達測試代碼中的'same_tree'方法時,你已經銷燬了你的子節點,並且只留下了根節點,這在測試代碼中是相同的。 – kamprath 2012-02-12 19:02:25

1

隱而不宣」它會打擾你,你是否缺少same_tree中的return語句以獲得相等的樹?編譯器應該警告你。如果您使用的是g ++,則應始終使用

-W -Wall (-pedantic is good as well) 
+0

是啊這就是真實的,可我做了什麼不是一個良好的編程習慣。但是我確定它在不相等的情況下返回-1。並在此基礎上進行主要檢查。但我仍然不確定爲什麼我得到兩個O/P。 Newaz +1爲你的建議 – Invictus 2012-02-12 18:58:22

+0

因爲你的函數(same_tree)將始終達到它返回-1(在某種遞歸級別)的條件。它會打印出「樹不相等」。然後執行會上升到堆棧,在頂部沒有返回語句,所以函數返回一些隨機值。 (0在你的情況下) – Kylo 2012-02-12 19:10:17

相關問題