根据我的家庭作业,我正在研究二元树。分配很简单,从输入文本文件中读取单词并创建包含频率数据的BST。
我只是搜索它并创建了一个alphebetically命令BST的实现,它对我很有用。
但我一直在努力的问题是,Rank each unique word in descending order of frequency.
树正在使用alpabetical排序,通过比较字符串并创建与之相关的节点......那么我如何继续使用它们的频率?我应该使用按字母排序的树元素创建一个频率平衡的新树吗?
任何帮助都会受到赞赏,非常感谢提前!
但我该如何保持计数
TreeNode.h:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
class treeNode
{
public:
char data[55];
int count;
struct treeNode *leftPtr, *rightPtr;
};
typedef struct treeNode TreeNode;
typedef TreeNode *TreeNodePtr;
void insertNode(TreeNodePtr *treePtr, char word[]);
void alphabetic(TreeNodePtr treePtr);
int sizeOfTree(TreeNodePtr treePtr);
TreeNode.cpp:
# include "treeNode.h"
void::insertNode(TreeNodePtr *treePtr, char word[55]){
TreeNode *temp = NULL;
if (*treePtr == NULL)
{
temp = (TreeNode *)malloc(sizeof(TreeNode));
temp->count = 1;
temp->leftPtr = NULL;
temp->rightPtr = NULL;
strcpy(temp->data, word);
*treePtr = temp;
}
else if (strcmp(word, (*treePtr)->data) < 0)
{
insertNode(&((*treePtr)->leftPtr), word);
}
else if (strcmp(word, (*treePtr)->data) > 0)
{
insertNode(&((*treePtr)->rightPtr), word);
}
else
{
(*treePtr)->count += 1;
}
}
void::alphabetic(TreeNodePtr treePtr)
{
if (treePtr != NULL)
{
alphabetic(treePtr->leftPtr);
printf("%s\t", treePtr->data);
printf("%d\n", treePtr->count);
alphabetic(treePtr->rightPtr);
}
}
int::sizeOfTree(TreeNodePtr treePtr){
if (treePtr == NULL)
return 0;
else
return(sizeOfTree(treePtr->leftPtr) + 1 + sizeOfTree(treePtr->rightPtr));
}
主要功能:
int main()
{
/*reading strings from the file and add them to the tree*/
int totalSize = 0;
char first[55];
FILE *fp1;
TreeNodePtr rootPtr = NULL;
int c;
//fp1 = fopen("%FILENAME%", "r");
fp1 = fopen("FILENAME%", "r");
do
{
c = fscanf(fp1, "%s", first);
if (c != EOF)
{
//printf(first);
insertNode(&rootPtr, first);
}
} while (c != EOF);
fclose(fp1);
//printf("%s", rootPtr->rightPtr->leftPtr->data);
alphabetic(rootPtr);
printf("%d\n",sizeOfTree(rootPtr));
system("PAUSE");
return 0;
}
更新:我直接要求使用BST作为数据结构,不应使用其他地图,散列或C ++ STL结构。
答案 0 :(得分:0)
不会要求您重新排列节点 in-tree 。要求您提取最常见的单词。
原则很简单。每个任务的一张地图,如:
std::map<string, int> wordmap; // this is your bst.
while(in>>word){
wordmap[word]++;
}
std::map<int, string, std::greater<int>> countmap;
for(auto word_and_count: wordmap){
countmap[wordmap.second] = wordmap.first;
}
请注意,这不是正常工作的代码。它旨在显示该过程。