2015-11-23 68 views
1
#include <fstream> 
#include <vector> 
#include <iterator> 
#include <iostream> 
#include <string> 
using namespace std; 

ifstream fin("1.inp"); 

class TreeNode { 
private: 
    friend class Tree; 
    int Keyvalue; 
    string Namevalue; 
    TreeNode *LeftChild; 
    TreeNode *RightChild; 

    TreeNode() { LeftChild = RightChild = 0; }; 
    TreeNode(int _Keyvalue, string _Namevalue, TreeNode *Lefty, TreeNode *Righty) { 
     Keyvalue = _Keyvalue; 
     Namevalue = _Namevalue; 
     LeftChild = Lefty; 
     RightChild = Righty; 
    } 
}; 

class Tree { 
private: 
    TreeNode *root; 
    void insert_to_tree(TreeNode *, int, string); 
    void show_tree(TreeNode *); 
public: 
    Tree() { root = 0; } 
    void insert_to_tree(int, string); 
    void delete_from_tree(int); 
    void show_tree(); 
    void setup(); 
}; 

void Tree::insert_to_tree(int _Keyvalue, string _Namevalue){ 
    insert_to_tree(root, _Keyvalue, _Namevalue); 
} 
//this is problem. 
void Tree::insert_to_tree(TreeNode *CurrentNode, int _Keyvalue, string _Namevalue){ 
    if (CurrentNode == 0) 
     CurrentNode = new TreeNode(_Keyvalue, _Namevalue, 0, 0); 
    else{ 
     if (CurrentNode->Keyvalue < _Keyvalue) 
      insert_to_tree(CurrentNode->RightChild, _Keyvalue, _Namevalue); 
     else if (CurrentNode->Keyvalue == _Keyvalue) 
      CurrentNode->Namevalue = _Namevalue; 
     else 
      insert_to_tree(CurrentNode->LeftChild, _Keyvalue, _Namevalue); 
    } 
} 

void Tree::delete_from_tree(int _Keyvalue){ 
} 

void Tree::show_tree(){ 
    show_tree(root); 
} 
void Tree::show_tree(TreeNode *CurrentNode){ 
    if (CurrentNode){ 
     if (CurrentNode->LeftChild == 0 && CurrentNode->RightChild == 0){ 
      cout << CurrentNode->Namevalue; 
     } 
     else{ 
      show_tree(CurrentNode->LeftChild); 
      show_tree(CurrentNode->RightChild); 
     } 
    } 
} 

void get_command(Tree &_MyTree){ 
    int Num_of_command; 
    string command; 
    fin >> Num_of_command; 
    for (int i = 0; i < Num_of_command; i++){ 
     fin >> command; 
     int Keyvalue; string Namevalue; 
     if (command == "ins"){ 
      fin >> Keyvalue >> Namevalue; 
      _MyTree.insert_to_tree(Keyvalue, Namevalue); 
     } 
     else if (command == "del"){ 
      fin >> Keyvalue; 
      _MyTree.delete_from_tree(Keyvalue); 
     } 
     else if (command == "leaves") 
      _MyTree.show_tree(); 
    } 
} 

int main(){ 
    Tree MyTree; 
    get_command(MyTree); 
} 

当我调用该函数在C++中,我不知道为什么我的函数没有返回结果

void Tree::insert_to_tree(int _Keyvalue, string _Namevalue){ 
    insert_to_tree(root, _Keyvalue, _Namevalue); } 

根本不是我的功能改变。该功能后

void Tree::insert_to_tree(TreeNode *CurrentNode, int _Keyvalue, string _Namevalue) 

根始终为0

+1

将函数签名更改为void void :: insert_to_tree(TreeNode *&CurrentNode,int _Keyvalue,string _Namevalue)' –

+0

您可能会考虑更改标题。你的函数是'void',这将是对标题中陈述的问题的简单回答,但我认为这不是你正在寻找的。 – user463035818

+0

我想添加 - 当你创建一个节点时,它不会插入你的树,只是在内存中创建和丢失它。你应该创建类似if的节点(CurrentNode-> RightChild == NULL)CurrentNode-> RightChild = new TreeNode(_Keyvalue,_Namevalue,0,0); –

回答

0

您创建一个新TreeNode但你永远不把它插入到树或返回创建TreeNode任何地方。

您可能的意思是通过引用(TreeNode *& CurrentNode)传递CurrentNode,这意味着在函数内部会看到对函数内部所做的任何更改。

1

您正在通过值传递根 - 这意味着您的函数会看到root的副本。无论它对它做什么,都不会影响原始。

考虑以下简单的例子:

#include <iostream> 

void foo(int x) { 
    x = 10; 
} 

int main() { 
    int k = 42; 
    foo(k); 

    std::cout << "k is now " << k << "\n"; 

    return 0; 
} 

如果你运行这段代码,你会看到中K保持不变,仍然是打印为42.这是因为foo()修改k的副本,这并不要触摸原始k。

相关问题