编写一个给定二叉树的布尔函数,如果树具有偶数个节点

时间:2016-11-02 00:55:41

标签: pointers data-structures tree binary-tree nodes

问:编写一个给定二叉树的布尔函数,当且仅当时,才返回true 树具有偶数个节点。空树被认为具有偶数个节点。

备注:

该函数应该只有一个参数,一个指向根的指针。

不能使用全局变量。

无法定义其他功能。您可能不计算节点数

2 个答案:

答案 0 :(得分:0)

以下假设由单个节点组成的树是奇数。也就是说,如果您的树仅由根节点组成,则该树具有奇数个节点。目前还不清楚你的描述中“空树”是什么意思。我认为它意味着“无效的根”。

即使节点组合,其子节点具有奇数个节点,也可以考虑节点。是的,很奇怪。因为你必须统计节点本身。考虑一下简单的二叉树:

  1
2   3

组合后,节点的子节点具有偶数个节点。但是你也必须计算根节点。

因此,一个孩子必须拥有偶数个节点,而另一个孩子必须拥有奇数个节点。

考虑一棵更大的树:

       1
   2       3
 4   5       6
7

节点4是偶数。节点5是奇数。节点2是偶数。节点6是奇数。节点3是偶数。节点1是奇数,因为两个孩子都是偶数。

真值表,假设even = true且odd = false:

left   right   result
false  false   false
false  true    true
true   false   true
true   true    false

因此如果两者都是真的或两者都是假的,那么它就是假的。如果任何一个为真,则结果为真。这是一个独家或。

这应该递归地工作。让我们试试上面的树。

  • 7没有节点,因此结果很奇怪。
  • 4具有奇数左节点和偶数右节点(空节点被认为是偶数)。 4是偶数。
  • 5没有节点,所以很奇怪。
  • 2是因为4是偶数,5是奇数。
  • 6很奇怪,因为它没有孩子。
  • 3甚至因为左边是偶数而右边是奇数。
  • 1是奇数,因为它的左右节点(2和3)都是偶数。

您应该能够根据描述编写递归函数。

答案 1 :(得分:0)

Bool isEven(treepr *p)
{
    if(p)
    {
        if(isEven(p->left) == isEven(p->right))
            return false;
        else
            return true;
    }

    return true;
}