我有一个带整数标签的二叉搜索树。 我必须用这个属性计算叶子(我将它称为属性x):父亲有一个偶数(奇数)标签,叶子有一个奇数(偶数)标签;然后我必须将这个数字存储在节点中。我必须为每个子树做这个。 最后,我必须为每个节点打印该号码。
例如,如果我有this tree,则输出应该是左侧的输出(有序访问)。
这是我的结构(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的叶子。 你能帮帮我吗?
编辑:我可能没有很好地解释这个属性,我会尝试重新编写。 如果标签是偶数且其父亲的标签是奇数,或者如果其标签是奇数并且其父亲的标签是偶数,则计算一张叶子。答案 0 :(得分:0)
您必须使用条件printree
语句修改if
函数,该语句检查奇数或偶数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
语句的一部分,您仍然需要确保进行所有递归调用。
答案 1 :(得分:0)
为您的std::function
函数引入一个counter()
参数,用于确定是否应计算一个叶子:
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()
。