C++ 二叉树-计数不同节点

C++ 二叉树-计数不同节点,c++,tree,size,binary-search-tree,C++,Tree,Size,Binary Search Tree,若有人问我二叉树中的节点数,那个么这很容易,但我被要求计算二叉树中不同节点的数量,如下所示。 有两个12值! 二叉树算法中的节点数如下: struct Node { string data; struct Node *left; struct Node *right; }; int getNumberOfNodes(Node* node) { if (node != NULL) return getNumberOfNodes(node->

若有人问我二叉树中的节点数,那个么这很容易,但我被要求计算二叉树中不同节点的数量,如下所示。 有两个12值!

二叉树算法中的节点数如下:

struct Node {
    string data;
    struct Node *left;
    struct Node *right;
};

int getNumberOfNodes(Node* node)
{
    if (node != NULL)
        return getNumberOfNodes(node->left) + 1 + getNumberOfNodes(node->right);
    else
        return 0;
}

但是对于唯一值,这太难了--

您可以通过添加容器来更改函数,以维护已经遇到的值。注释
std::set
中建议了最佳容器

新守则将是:

int getNumberOfNodes(Node* node, std::set<string>& uniqueValues)
{
    if (node != NULL)
    {
       int count = 0;
       if ( uniqueValues.find( node->data ) == uniqueValues.end() )
       {
          count = 1;
          uniqueValues.insert ( node->data );
       }

       return getNumberOfNodes(node->left,uniqueValues) + count + getNumberOfNodes(node->right,uniqueValues);
    }
    else
        return 0;
}
int getNumberOfNodes(节点*节点,标准::设置和唯一值)
{
如果(节点!=NULL)
{
整数计数=0;
if(uniqueValues.find(节点->数据)=uniqueValues.end())
{
计数=1;
uniqueValues.insert(节点->数据);
}
返回getNumberOfNodes(节点->左,唯一值)+计数+getNumberOfNodes(节点->右,唯一值);
}
其他的
返回0;
}
与您的代码没有太大区别。
最后,
uniqueValues.size()
将等于返回的整数。

在调用函数之前,请清除
uniqueValues

您可以通过添加容器来更改函数,以维护已经遇到的值。注释
std::set
中建议了最佳容器

int count_label(Node *root, int data)
{
    int count_of_data = 0;
    if(root == NULL)
    return 0;
    if(data == root->data)
    count_of_data += 1;
    if(data > root->data)
        count_of_data += count_label(root->right,data);
    else
        count_of_data += count_label(root->left,data);

    return count_of_data;
}
//--------------------------------------------------------
unsigned int unique_nodes(Node *root)
{
    int count_u = 0;
    if(root == NULL)
        return 0;
    if(count_label(root, root->data) == 1)
    {
        count_u += 1;
    }
    count_u += unique_nodes(root->left);
    count_u += unique_nodes(root->right);
    return count_u;
}
新守则将是:

int getNumberOfNodes(Node* node, std::set<string>& uniqueValues)
{
    if (node != NULL)
    {
       int count = 0;
       if ( uniqueValues.find( node->data ) == uniqueValues.end() )
       {
          count = 1;
          uniqueValues.insert ( node->data );
       }

       return getNumberOfNodes(node->left,uniqueValues) + count + getNumberOfNodes(node->right,uniqueValues);
    }
    else
        return 0;
}
int getNumberOfNodes(节点*节点,标准::设置和唯一值)
{
如果(节点!=NULL)
{
整数计数=0;
if(uniqueValues.find(节点->数据)=uniqueValues.end())
{
计数=1;
uniqueValues.insert(节点->数据);
}
返回getNumberOfNodes(节点->左,唯一值)+计数+getNumberOfNodes(节点->右,唯一值);
}
其他的
返回0;
}
与您的代码没有太大区别。
最后,
uniqueValues.size()
将等于返回的整数。

在调用函数之前,请清除
唯一值。

您需要一个集合来记忆遇到的所有数字。然后计算集合的大小,这是树中唯一的总数。如果不想使用额外的O(n)内存,您可以从BST创建一个
max heap
,然后迭代其节点,并在根等于其子节点时将总计数减少1。您需要一个集合来记住它遇到的所有数字。然后计算集合的大小,这就是树中唯一的总数。如果您不想使用额外的O(n)内存,可以从BST创建一个
max heap
,然后在其节点上迭代,并在根等于其子节点时将总计数减少1。哇哇哇,很好。谢谢成功了。顺便说一句:我更正了这行:返回getNumberOfNodes(node->left,uniqueValues)+count+getNumberOfNodes(node->right,uniqueValues);我也改正了,在回答中,可能是在你复制它之后。谢谢成功了。顺便说一句:我更正了这行:返回getNumberOfNodes(node->left,uniqueValues)+count+getNumberOfNodes(node->right,uniqueValues);我也在回答中更正了它,可能是在你复制它之后。
int count_label(Node *root, int data)
{
    int count_of_data = 0;
    if(root == NULL)
    return 0;
    if(data == root->data)
    count_of_data += 1;
    if(data > root->data)
        count_of_data += count_label(root->right,data);
    else
        count_of_data += count_label(root->left,data);

    return count_of_data;
}
//--------------------------------------------------------
unsigned int unique_nodes(Node *root)
{
    int count_u = 0;
    if(root == NULL)
        return 0;
    if(count_label(root, root->data) == 1)
    {
        count_u += 1;
    }
    count_u += unique_nodes(root->left);
    count_u += unique_nodes(root->right);
    return count_u;
}