创建一棵树

时间:2017-04-11 22:53:38

标签: c++ tree binary-search-tree

我应该做一个简单的任务,但是在了解了树是什么以及如何使用树之后,我已经油腻并且无法解决问题。我理解为什么这个程序不起作用,我只是找不到解决方案。

分配是创建一个包含字符串数据的树。我们给出了一个包含由行分隔的字符串的文本文件,我们将创建一个包含数据的树。每行包含三个字符串。最左边的字符串进入节点,中间字符串进入节点左子节点,最右边的字符串进入节点右子节点。此外,如果左或右字符串是" null",则表示该节点分别在左侧或右侧没有子节点。

文本文件看起来像这样......

dog over brown
over red jumped
red The quick 
The null null

结果树将是这样的: Dog将是根节点,向左指向over并指向brownOver会指向red,并指向jumpedRed将指向The,并指向quick

这是我尝试创建此程序:

struct Node
{
    string name;
    Node *left;
    Node *right;
};

Node* allocNode(string name) {
    Node *newNode = new Node();
    newNode->name = name;
    newNode->left = newNode->right = NULL;
    return newNode;
}

Node* Insert(Node* rootPtr, string left, string mid, string right);

int main(int argc, const char * argv[]) {
    Node* rootPtr;
    rootPtr = NULL; //empty tree
    cout << "Specify an input file:\n";
    string filepath;
    cin >> filepath;
    ifstream istream (filepath);
    string line;

    while (getline(istream,line))
    {
        string word[3];
        stringstream ssin(line);
        int i = 0;
        while (ssin.good())
        {
            ssin >> word[i];
            i++;
        }
        string left = word[0];
        string mid = word[1];
        string right = word[2];
        rootPtr = Insert(rootPtr, left, mid, right);
    }


    return 0;
}


Node* Insert(Node* rootPtr, string left, string mid, string right)
{
    rootPtr = allocNode(left);

    if (mid != "null") {
        rootPtr->left = Insert(rootPtr->left,mid);//problem here
    }

    if (right != "null") {
        rootPtr->right = Insert(rootPtr->right, right); //problem here
    }
    return rootPtr;
}

根据我的理解,问题在于递归。特别是当我尝试将左指针或右指针分配给rootPtr时,因为在递归时我不能在输入文件中向下行,因此无法插入节点。我尝试了一些不同的东西,弄乱了参数,但我还没有能够解决它。有人可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

您的pd.cut( s, [-np.inf] + [100 * i for i in range(10)] + [np.inf] ).value_counts(sort=False).plot.bar() 函数属性为Insert参数,但> ,因为此指针会立即重置为新分配的Node* rootPtr

Node

因为新分配的Node* Insert(Node* rootPtr, string left, string mid, string right) { rootPtr = allocNode(left); ... rootPtr->left都是rootPtr->right - 尽管这很重要,因为它们会立即传回NULL。如果你不小心你会有一个无限循环,但很难说,因为你对Insert的内部调用只有两个参数而不是所需的4,因此它们不应该编译。您应该重新检查传递给Insert的每个参数的含义以及应如何处理它们。

答案 1 :(得分:0)

您可以将问题分解为更简单的部分。假设你正在文件的一半,树是完整的,你读了一行:

dish ran away

你要做什么?根据示例中的模式,节点dish必须已经是树中的叶子(即,leftright都为空的节点。所以你必须

  1. 找到'菜肴',
  2. 给它一个新的左节点,`ran`和
  3. 给它一个新的右边节点,`away`。

第一步需要一个函数,它以递归方式搜索树,查找具有给定名称的节点,并返回指向该节点的指针(如果树中没有这样的节点,则为null)。之后步骤2和3很容易。

一旦有效,您可以毫不费力地遍历文件。不要忘记你必须特别注意第一个节点,即树的根。