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

时间:2017-10-26 16:42:15

标签: c++ binary-search-tree

我有一个带整数标签的二叉搜索树。 我必须用这个属性计算叶子(我将它称为属性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的叶子。 你能帮帮我吗?

编辑:我可能没有很好地解释这个属性,我会尝试重新编写。 如果标签是偶数且其父亲的标签是奇数,或者如果其标签是奇数并且其父亲的标签是偶数,则计算一张叶子。

2 个答案:

答案 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()