【发布时间】:2020-02-23 23:14:48
【问题描述】:
本质上,对于如何将字符串与我的insert 函数进行比较,我是一堵砖墙,在将相同的字符串与其原始大小写同时插入时不考虑大小写。
这是我的insert 函数。
TreeNode* Tree::insert(TreeNode* node, string value) {
transform(value.begin(), value.end(), value.begin(), ::tolower);
if (node == nullptr) {
return newTreeNode(value);
}
if (node->data < value) {
node->left = insert(node->left, value);
}
else if(node-> data > value) {
node->right = insert(node->right, value);
}
else {
return node;
}
node->height = 1 + max(height(node->left), height(node->right));
return node;
}
这是我的树头文件:
struct TreeNode {
public:
TreeNode* left;
TreeNode* right;
string data;
};
class Tree {
public:
TreeNode * newTreeNode(string data);
TreeNode * insert(TreeNode* node, string value);
void lexographicPrint(TreeNode* root);
};
newTreeNode 函数:
TreeNode* AvlTree::newTreeNode(string value) {
TreeNode* treeNode = new TreeNode();
treeNode->data = value;
treeNode->left = nullptr;
treeNode->right= nullptr;
treeNode->height = 1;
return treeNode;
}
打印功能:
void AvlTree::lexographicPrint(TreeNode* root) {
if (root != nullptr) {
lexographicPrint(root->right);
cout << root->data << " ";
lexographicPrint(root->left);
}
}
这目前可以按我的意愿工作,除了 Tree 包含所有小写的值,这显然是由于 transform 函数。我尝试过使用holdValue,如下所示:
string holdValue;
if (isupper(value[0]) {
holdValue = value;
}
在我的函数顶部,用holdValue 替换所有insert 调用。我很困惑为什么在与value 进行比较时会改变我的树的顺序。我希望这能奏效,但事实并非如此。我还没有通过 Google 搜索找到解决方案。
【问题讨论】:
-
请用无效的代码创建一个minimal reproducible example。
-
添加了 newTreeNode() 和 lexicographicPrint() 函数。这就是我从你提供的链接中得到的,如果我弄得更糟,对不起。
-
首先,创建一个返回
true或false的compare函数,具体取决于插入的字符串是否小于树中的字符串——不要硬编码在insert中进行比较。一旦你有了它,你就有了如何解决问题的框架,那就是compare函数在某种程度上应该是通用的。 -
明白了,谢谢。本质上,我正在创建一个单独的
compare,其中true可以表示插入左节点和右节点(反之亦然),比较函数将忽略大小写,而insert函数将保留原始价值观? -
@Suede -- 是的 -- 到目前为止,其他人给出的两个答案都抓住了你应该做的事情的本质。
标签: c++ binary-tree binary-search-tree string-comparison