简体   繁体   English

使用 C++ 在二叉搜索树中存储值

[英]Storing values in binary search tree with C++

This code for a standard binary search tree does not contain any information, only the value of the nodes.标准二叉搜索树的此代码不包含任何信息,仅包含节点的值。 Is there any way I can contain another value, for example, age, in the nodes?有什么办法可以在节点中包含另一个值,例如年龄? So that the node number will be id and the value it is carrying will be the age .Essentially every node would contain a key-value pair.因此节点编号将是id并且它携带的值将是年龄。基本上每个节点都将包含一个键值对。 Thank you for your help!感谢您的帮助!

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

struct node
{
int key;
struct node *left, *right;
};

//to create a new BST node
struct node *newNode(int item)
{
struct node *temp = (struct node *)malloc(sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}

// to do inorder traversal of BST
void inorder(struct node *root)
{
if (root != NULL)
{
inorder(root->left);
printf("%d \n", root->key);
inorder(root->right);
}
}

//function to insert a new node with given key in BST
struct node* initialize(struct node* node, int key)
{
/* If the tree is empty, return a new node */
if (node == NULL) return newNode(key);

/* Otherwise, recur down the tree */
if (key < node->key)
node->left = initialize(node->left, key);
else if (key > node->key)
node->right = initialize(node->right, key);

/* return the  node pointer */
return node;
}
struct node* insert(node* root, int key)
{
    // Create a new Node containing
    // the new element
    node* newnode = newNode(key);

    // Pointer to start traversing from root and
    // traverses downward path to search
    // where the new node to be inserted
    node* x = root;

    // Pointer y maintains the trailing
    // pointer of x
    node* y = NULL;

    while (x != NULL) {
        y = x;
        if (key < x->key)
            x = x->left;
        else
            x = x->right;
    }

    // If the root is NULL i.e the tree is empty
    // The new node is the root node
    if (y == NULL) {
        y = newnode;
    }

    // If the new key is less then the leaf node key
    // Assign the new node to be its left child
    else if (key < y->key){
        y->left = newnode;
    }

    // else assign the new node its right child
    else{
        y->right = newnode;
    }
   
    // Returns the pointer where the
    // new node is inserted
    return y;
}

Just declare the node like只需像这样声明节点

template <typename Key, typename Value>
struct node
{
    Key key;
    Value value;
    struct node *left, *right;
};

Pay attention to that instead of malloc you should use the operator new.请注意,您应该使用运算符 new 而不是 malloc。

For example例如

template <typename Key, typename Value>
struct node<Key, Value>  *newNode( const Key &key, const Value &value )
{
    return new node<Key, Value> { key, value, nullptr, nullptr };
}

That is if you are writing a C++ program then use C++ constructions.也就是说,如果您正在编写 C++ 程序,则使用 C++ 结构。

The function insert can be defined the following way可以通过以下方式定义函数insert

template <typename Key, typename Value>
struct node
{
    Key key;
    Value value;
    struct node *left, *right;
};

template <typename Key, typename Value>
struct node<Key, Value>  * newNode( const Key &key, const Value &value )
{
    return new node<Key, Value> { key, value, nullptr, nullptr };
}


template <typename Key, typename Value>
void insert( node<Key, Value> * &head, const Key &key, const Value &value )
{
    node<Key, Value> **current = &head;

    while ( *current != nullptr )
    {
        if ( key < ( *current )->key ) current = &( *current )->left;
        else current = &( *current )->right;
    }

    *current = newNode( key, value );
}                             

In main you can write在主要你可以写

int main()
{
    node<int, unsigned int> *head = nullptr;

    //…
}

If this is not a university project, don't bother creating your own Binary Search Tree unless you really want to learn how to do that.如果这不是大学项目,请不要费心创建自己的二叉搜索树,除非您真的想学习如何做到这一点。 As C++ provides you a Binary Search Tree in the form of std::map and std::set由于 C++ 以 std::map 和 std::set 的形式为您提供二叉搜索树

std::map<int, std::string> myMap

defines a tree that uses integers as keys, and stores std::strings.定义一个使用整数作为键并存储 std::strings 的树。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM