这个代码块在世界上如何阻止工作[树]?

时间:2012-02-15 20:10:44

标签: c++ tree

以下代码块的工作原理如何?更具体地说,程序如何知道要返回哪个选项?

return    ancestor (node1->left(), node2)
           || ancestor (node1->right(), node2)
           || ancestor (node2->left(), node1)
           || ancestor (node2->left(), node1);

此代码块是遍历树的代码的一部分,以便在给定树中的node1和node2时确定一个节点是否是另一个节点的祖先。

请注意,node1和node2被传递给负责确定是否存在祖先/后代关系的函数:

bool ancestor (const Binary_node<Type> * node1, const Binary_node<Type> * node2)
{
         // .... code
}

8 个答案:

答案 0 :(得分:2)

如果对ancestor的一次调用返回true,则返回true(不评估其余的调用)。

答案 1 :(得分:2)

这些术语从左到右进行评估,第一个术语true终止评估(快捷方式布尔评估)并返回true。否则结果为false

答案 2 :(得分:2)

  

程序如何知道要返回哪个选项?

程序将继续尝试这些选项,直到找到有效的选项。

  

以下代码块的工作原理是什么?

在每次调用祖先()时,该函数将尝试四种可能性:

  • 将node1移动到其左子树,并尝试解决其余问题。
  • 如果这不起作用,请尝试将node1移动到其右子树。
  • 如果不起作用,请将node2移到其左子树。
  • 如果不起作用,请将node2移动到右侧子树。

如果所有四种可能性都失败了,那么节点node1和node2肯定不会通过祖先关系相关。

警告:实施后,祖先功能非常慢,除了非常小的树。因为我们在每个祖先()调用中尝试四个选项,如果将树的高度增加1,则状态数大致为四倍。

答案 3 :(得分:1)

它从左到右进行评估,因此首先测试ancestor (node1->left(), node2)。接下来,它查看按位运算符||,它基本上表示“如果前一个操作为假,则尝试下一个操作”。

答案 4 :(得分:1)

我猜你的函数会返回一个bool。如果其中一个祖先是真的,它将返回true。如果使用两个布尔值,则结果如下:

A       B     (A  ||  B)
false  false    false
true   false    true
false  true     true
true   true     true

如果使用多个布尔值(或值,可以解释为布尔值),则A||B||C..等于((A||B)||C)||...

答案 5 :(得分:1)

它返回一个布尔值。因此,您引用的块仅使用short circuiting返回它找到的第一个true值,如果它们都是这样评估,则使用false

答案 6 :(得分:1)

如果一个陈述有几个由||链接的子句或者&amp;&amp;然后评估是从左到右,第一次机会短路。在这种情况下为||正在使用该函数将从左到右(或在代码布局中从上到下)工作,并且第一次评估为true时它将返回true,从而避免评估其他选项。

答案 7 :(得分:1)

请注意,祖先只返回true / false。此代码使用早期逻辑表达式评估。在'或'(||)语句中。如果第一次调用没有返回true,则调用下一个,依此类推,直到其中一个返回true。如果它们都没有返回true,则返回false。

在这段代码中:如果我发现node1-&gt; left()是node2的祖先,我不必评估其余的语句,因为我已经知道了答案。