计算每个子树(二进制搜索树)具有特定属性的叶子的数量
counting the number of leaves with a certain property for each subtree (binary search tree)
我有一个带有整数标签的二进制搜索树。我必须用这个性质来计算叶子(我称之为性质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
语句的一部分,您仍然需要确保获得所有递归调用。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- C++调用具有 *this 属性的单个帮助程序函数
- C++ 在堆栈中包含多态属性的类对象存储
- C++ 命名参数习惯用语 - 未设置字符串属性
- 计算每个子树(二进制搜索树)具有特定属性的叶子的数量