我应该做一个简单的任务,但是在了解了树是什么以及如何使用树之后,我已经油腻并且无法解决问题。我理解为什么这个程序不起作用,我只是找不到解决方案。
分配是创建一个包含字符串数据的树。我们给出了一个包含由行分隔的字符串的文本文件,我们将创建一个包含数据的树。每行包含三个字符串。最左边的字符串进入节点,中间字符串进入节点左子节点,最右边的字符串进入节点右子节点。此外,如果左或右字符串是" null",则表示该节点分别在左侧或右侧没有子节点。
文本文件看起来像这样......
dog over brown
over red jumped
red The quick
The null null
结果树将是这样的:
Dog
将是根节点,向左指向over
并指向brown
。
Over
会指向red
,并指向jumped
。
Red
将指向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时,因为在递归时我不能在输入文件中向下行,因此无法插入节点。我尝试了一些不同的东西,弄乱了参数,但我还没有能够解决它。有人可以指出我正确的方向吗?
答案 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
必须已经是树中的叶子(即,left
和right
都为空的节点。所以你必须
第一步需要一个函数,它以递归方式搜索树,查找具有给定名称的节点,并返回指向该节点的指针(如果树中没有这样的节点,则为null)。之后步骤2和3很容易。
一旦有效,您可以毫不费力地遍历文件。不要忘记你必须特别注意第一个节点,即树的根。