问题描述
我正在编写一个函数,以在二叉搜索树中输出最常见的单词,但它会按字母顺序而不是最常见的单词在bst的顶部输出单词。
例如:
输入:abc abc abc abc xyz xyz xyz xyz xyz xyz
输出:abc
我真的不知道问题是什么,任何帮助将不胜感激。
void WordAnalyzer::findCommon(TreeNode* root) {
if (root != NULL) {
findCommon(root->left);
if (prev != NULL) {
if (root->data == prev->data) {
currCount++;
}
else {
currCount = 1;
}
}
if (currCount > maxCount) {
maxCount = currCount;
maxWord = root->data;
}
prev = root;
findCommon(root->right);
}
}
string WordAnalyzer::getMostCommonWord() {
findCommon(root);
return maxWord;
}
解决方法
从代码中尚不清楚Parser
的初始化方式和初始化位置,但是如果在运行此代码之前未明确初始化currCount
,则您的行为不确定。
在查看BST中的第一个(最左边)元素时,您设置了prev = root
,但没有设置currCount
,那么当您访问下一个元素时,您增加了currCount
乘以1,但您从未给过它一个初始值,并且它基本上可以包含任何“垃圾”值。
只需创建一个键为“ word”且值为“ count”的地图即可。使用任何遍历(例如Inorder)遍历BST,并增加对应于地图中“单词”的计数。然后,当整个遍历结束时,签入您的主要功能,即Map中计数最高的单词。
如果您不熟悉Map数据结构,这里是快速参考。 http://www.cplusplus.com/reference/map/map/insert/