バイナリツリーを使用しているので、TreeNode
のキーとして文字列を使用することはできません私はいつもインゴイザーを使いました)。
// I am not sure about types, but I assumed them by name
struct Element {
char* name;
int type;
int order;
char* color;
};
struct TreeNode {
int key;
Element *element;
TreeNode *left, *right;
};
は、その後、あなたが何らかの形で鍵となる数値を、取得するためにElement::name
のハッシュを計算します:だから私はお勧めすることは、このような構造を持っているということです。今度は、キーに応じてルートから左または右にツリーをたどるだけです。挿入しているキーが現在のノードのものと同じであるかどうかをチェックし、答えがyesの場合はそのノードの値を入れ替えます。そうでなければ、ツリーを左右に移動し続けます。一番下に来たら、そのキーを持つノードを見つけられていないということです。新しいノードを作成し、それをリーフとして接続します。
このlinkを見ると、ハッシュが生成されます。ただし、一部の文字列では同じハッシュ値を得ることができるので、現在のツリーノードに複数の要素を保持する必要があります。
UPDATEここ
は、しかし、あなたは、ポインタを使用して、よりそれを最適化することができ、コードです。しかし、コメントに記載されているように、バイナリツリーの使用に厳密に縛られていない場合は、HashTableまたはstd::mapを使用する必要があります。
std::map<std::string, struct Element*> elements
と要素取得のために:
Element *e = elements["corn"]
バイナリツリーの実装:
#include <iostream>
#include <vector>
#define A 54059 /* a prime */
#define B 76963 /* another prime */
#define C 86969 /* yet another prime */
#define FIRSTH 37 /* also prime */
struct Element {
std::string name;
std::string type;
int order;
std::string color;
};
struct TreeNode {
int key;
std::vector<Element> values;
struct TreeNode *left;
struct TreeNode *right;
};
/**
* see: https://stackoverflow.com/questions/8317508/hash-function-for-a-string
*/
int calculateHash(const char *s)
{
int h = FIRSTH;
while (*s) {
h = (h * A)^(s[0] * B);
s++;
}
return h; // or return h % C;
}
void printElement(Element element)
{
std::cout
<< element.name
<< " "
<< element.type
<< " "
<< element.order
<< " "
<< element.color
<< std::endl;
}
void preOrder(TreeNode* node)
{
if(node == NULL)
return;
for(size_t i=0; i<node->values.size(); i++) {
printElement(node->values[i]);
}
preOrder(node->left);
preOrder(node->right);
}
void insert(TreeNode** root, Element element, int key)
{
if(*root == NULL) {
TreeNode* node = new TreeNode();
node->key = key;
node->values.push_back(element);
*root = node;
return;
};
if(key == (*root)->key) {
for(size_t i=0; i<(*root)->values.size(); i++) {
if((*root)->values[i].name == element.name) {
(*root)->values[i].type = element.type;
(*root)->values[i].order = element.order;
(*root)->values[i].color = element.color;
break;
}
}
}
else if(key < (*root)->key) {
insert(&((*root)->left), element, key);
}
else {
insert(&((*root)->right), element, key);
}
}
int main()
{
TreeNode *node = NULL;
insert(&node, {"corn1", "oil", 3, "yellow"}, calculateHash("corn1"));
insert(&node, {"corn2", "oil", 3, "yellow"}, calculateHash("corn2"));
insert(&node, {"corn3", "oil", 3, "yellow"}, calculateHash("corn3"));
insert(&node, {"corn2", "aaa", 32, "blue"}, calculateHash("corn2"));
preOrder(node);
return 0;
}
ハッシュテーブルが、その場合には、より効率的であるが、それはあなたがどのような他の依存をそのツリーを使用して – FamZ
上記のように4つのものを持つ木の作物データを挿入する –
のみを挿入/更新してデータを検索する場合は、ハッシュテーブルを使用する方が良い解決法です。 – FamZ