【问题标题】:Write a Boolean function that is given a binary tree and returns true if the tree has an even number of nodes编写一个给定二叉树的布尔函数,如果二叉树的节点数为偶数,则返回 true
【发布时间】:2016-11-02 00:55:41
【问题描述】:

Q:写一个布尔函数,给定一棵二叉树,当且仅当 树有偶数个节点。一棵空树被认为有偶数个节点。

注意事项:

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

不能使用全局变量。

不能定义额外的函数。你可以不计算节点数

【问题讨论】:

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


    【解决方案1】:

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

    即使它的子节点有奇数个节点,也可以考虑一个节点。是的,奇怪。因为您必须计算节点本身。考虑简单的二叉树:

      1
    2   3
    

    结合起来,节点的子节点有偶数个节点。但是你也必须计算根节点。

    所以一个孩子必须有偶数个节点,另一个必须有奇数个节点。

    考虑一棵更大的树:

           1
       2       3
     4   5       6
    7
    

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

    真值表,假设偶数=真奇数=假:

    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)都是偶数。

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

    【讨论】:

    • 感谢您的解释。
    【解决方案2】:
    Bool isEven(treepr *p)
    {
        if(p)
        {
            if(isEven(p->left) == isEven(p->right))
                return false;
            else
                return true;
        }
    
        return true;
    }
    

    【讨论】:

    • 您可以将其写在一行中:return !p || (IsEven(p->left) ^ IsEven(p->right));
    • 你能解释一下吗,(IsEven(p->left) ^ IsEven(p->right)) ?我不确定它到底是做什么的。
    • 这是一个exclusive or。如果两个操作数都为真或两个操作数都为假,则结果为假。仅当一个操作数为真而另一个为假时,结果才为真。我在答案中展示了真值表。
    • 好的。非常感谢。
    • @JimMischel 你能帮我解决这个问题吗? Here is link
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2023-04-01
    • 2020-07-18
    • 2021-12-18
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多