【发布时间】:2016-11-02 00:55:41
【问题描述】:
Q:写一个布尔函数,给定一棵二叉树,当且仅当 树有偶数个节点。一棵空树被认为有偶数个节点。
注意事项:
函数应该只有一个参数,一个指向根的指针。
不能使用全局变量。
不能定义额外的函数。你可以不计算节点数
【问题讨论】:
标签: pointers data-structures tree binary-tree nodes
Q:写一个布尔函数,给定一棵二叉树,当且仅当 树有偶数个节点。一棵空树被认为有偶数个节点。
注意事项:
函数应该只有一个参数,一个指向根的指针。
不能使用全局变量。
不能定义额外的函数。你可以不计算节点数
【问题讨论】:
标签: pointers data-structures tree binary-tree nodes
以下假设由单个节点组成的树是奇数。也就是说,如果您的树仅包含根节点,则该树具有奇数个节点。目前尚不清楚您的描述中的“空树”是什么意思。我以为它的意思是“空根”。
即使它的子节点有奇数个节点,也可以考虑一个节点。是的,奇怪。因为您必须计算节点本身。考虑简单的二叉树:
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
所以如果两者都为真或都为假,那么它就是假的。如果其中任何一个为真,则结果为真。这是一个异或。
这应该递归地工作。让我们试试上面的树。
根据该描述,您应该能够编写递归函数。
【讨论】:
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));