计算每个子树(二进制搜索树)具有特定属性的叶子的数量

counting the number of leaves with a certain property for each subtree (binary search tree)

本文关键字:属性 叶子 搜索树 二进制 计算      更新时间:2023-10-16

我有一个带有整数标签的二进制搜索树。我必须用这个性质来计算叶子(我称之为性质x):父亲有一个偶数(奇数)标签,叶子有一个奇数(偶数)标签;那么我必须将这个数字存储在节点中。我必须对每个子树都这样做。最后,我必须打印每个节点的编号。

例如,如果我有这个树,那么输出应该是左边的那个(按顺序访问)。

这是我的结构(L是满足该节点属性x的叶数)

struct node {
int label;
node*right;
node*left;
int L;
};

到目前为止,这些都是我编写的函数。

void addnodeBST(node*&tree, int l) { //adds a node
if (!tree) {
tree = new node;
tree->label = l;
tree->right = tree->left = 0;
tree->L = 0;
return;
}
if (l < tree->label)
addnodeBST(tree->left, l);
if (l > tree->label)
addnodeBST(tree->right, l);
}
int counter(node*tree) { //counts how many leaves are there
if (!tree)
return 0;
if (!tree->left && !tree->right)
return 1;
return counter(tree->left) + counter(tree->right);
}
void updateL(node*tree) { //updates tree->L for each node
if (tree) {
tree->L = counter(tree);
if (!tree->right && !tree->left)
tree->L = 0;
updateL(tree->left);
updateL(tree->right);
}
}
void printree(node*tree) { //prints L for each node
if (tree) {
printree(tree->left);
cout << tree->L << endl;
printree(tree->right);
}
}

函数"counter"计算每个叶子,但我不知道如何修改它,使其只计算满足属性x的叶子。你能帮我吗?

编辑:我可能没有很好地解释这处房产,我会尝试重新出售。如果一片叶子的标签是偶数且其父亲的标签是奇数,或者如果其标签是奇数且其父亲标签是偶数,则对其进行计数。

为您的counter()函数引入一个std::function参数,该参数用于确定是否应计数叶:

int counter(node*tree, 
std::function<bool (const node*)> check = [](const node*){ return true}) 
{
if (!tree)
return 0;
if (!tree->left && !tree->right && check (tree))
return 1;
return counter(tree->left) + counter(tree->right);
}

你可以使用类似的功能

int count = counter(tree,[](const node* node) 
{ return !(node->label % 2); } // count only leafs with even label property
);

也许可以将函数重命名为count_leaf_if()

您必须使用条件if语句来修改printree函数,该语句检查奇数或偶数label属性(模算术)。如果是true,则打印数据L,否则打印0

一个示例片段可能是:

if (tree->label % 2 == 0) // if the label property is even
std::cout << tree->L << std::endl;
else
std::cout << 0 << std::endl;

确保只有cout语句是if语句的一部分,您仍然需要确保获得所有递归调用。