我已经构建了一个BST,其中包含一个名称,因为它是主要数据,以及与该名称相关联的权重(如插入信息时,它以Tom - 150的形式输入,但由Tom在树中排序) 。我需要能够确定谁的体重最低,我不知道该如何去做。下面是类和add方法的代码,我有很多其他的,但不觉得有必要发布它们似乎无关(我可以,如果需要)。
#include <iostream>
using namespace std;
class tNode
{
public:
string name;
int wt;
tNode *left, *right;
tNode()
{
left = right = 0;
}
tNode(string name, int wt, tNode *l = 0, tNode *r = 0)
{
this->name = name;
this->wt = wt;
left = l;
right = r;
}
};
class bSTree
{
public:
tNode *root;
bSTree()
{
root = 0;
}
bool add(string name, int wt)
{
tNode *temp = root, *prev = 0;
while (temp != 0)
{
prev = temp;
if (name < temp->name)
{
temp = temp->left;
}
else
{
temp = temp->right;
}
}
if (root == 0)
{
root = new tNode(name, wt);
}
else if (name < prev->name)
{
prev->left = new tNode(name, wt);
}
else if (name > prev->name)
{
prev->right = new tNode(name, wt);
}
else
{
return false;
}
return true;
}
无论如何,这样做的技巧是什么?我找到了最低的名字值(按字母顺序),只要尽可能地沿着树的左下方,但我不是100%肯定找到最低权重的技术,因为树没有按重量排序。我没有经验,因为我想要使用c ++,我唯一能想到的就是经历每一个重量,将数据输入到int,然后对int进行排序以找到最低的。我无法想象这是正确的方法,或者至少是最有效的方法。任何帮助总是受到赞赏。谢谢!
编辑: 这是我到目前为止所提出的:
void searchWeight(tNode* temp)
{
// DETERMINE LOWEST WEIGHT CONTAINED IN TREE
if (temp != 0)
{
cout << temp->wt << endl;
searchWeight(temp->left);
searchWeight(temp->right);
}
}
这会将所有权重输出到控制台,但我不知道如何通过每个权重并确定最低权重。我已经尝试在那里添加另一个if语句
if(currwt < minwt)
minwt = currwt
但最终输出不正确。
答案 0 :(得分:2)
您不必对树进行排序以获得最小权重的节点。 只需对树进行遍历并存储最低重量和重量最轻的人。如果当前节点的权重小于最小权重,则更新两个变量。在遍历结束时,您的权重最低。
伪代码看起来像,
minWeight = 0
minWeightPerson = ""
for each node in the tree:
if ( minWeight > weight of current node):
minWeight = weight of current node
minWeightPerson = person in current node
return minWeightPerson
答案 1 :(得分:1)
您需要遍历整个BST,因为您没有按树的主键搜索。您可以使用任何树遍历算法。
如果你需要按重量搜索很多次(并且只是搜索整个树的速度不够快),那么建立一个“索引”是值得的,即第二个BST指向第一个BST中的节点,但在辅助密钥上排序。
在树中循环一次将是O(n)
,但循环遍历树m次将是O(m*n)
。构建具有不同索引的第二个二叉搜索树将为O(n*log(n))
,然后搜索第二个树m
次将为O(m*log(n))
,因此整个操作为O(n*log(n)+m*log(n)) = O((n+m)*log(n))
。