您好我想知道是否有人可以帮助我了解当我有几个涉及布尔运算符的递归调用时会发生什么? 那么例如这个代码将如何运行?
boolean covers(TreeNode root, TreeNode p) {
if(root == null) return false;
if(root == p) return true;
return covers(root.left, p) || covers(root.right, p); //this is what confuses me
}
对于上下文TreeNode root是Btree的根,TreeNode p是Btree中的节点。
答案 0 :(得分:1)
我们正在树上搜索,例如:
a
/ \
b c
想象一下,我们有兴趣找出节点c是否被a覆盖(覆盖)。
解压缩方法:
boolean covers(TreeNode root, TreeNode p) { // does root, cover the node p
if(root == null) return false; // if null no
if(root == p) return true; // if root == p then yes
return covers(root.left, p) || covers(root.right, p); // if i'm not not p, could one of my children be p
}
因为这是递归的,所以我们再次继续该方法,这次将root作为左子节点。这导致深度优先搜索,当我们用尽左边的节点进行测试时,第一个右边节点被评估。 请注意,如果:covers(root.left,p) - 返回true,则永远不会评估cover(root.right,p)。
a
/ \
b c
/ \
d e
在我们的示例中,如果我们正在搜索节点c。我们会这样递归:
covers(a, c)
covers(b, c)
covers(d, c)
covers(e, c)
covers(c, c) <- returns true
答案 1 :(得分:0)
返回封面(root.left,p)|| cover(root.right,p);
如果任何一个函数&#39;该行将返回true。 return为true(因为||)。
如果node == p,函数将返回true,否则它们将到达leaf并变为null并返回false。
答案 2 :(得分:0)
代码首先会检查root
是否为null
。如果是,则无法覆盖元素p
,因此返回值为false
。
之后,代码将检查元素是否相等。因此p
涵盖root
,如果它等于root
。因此返回true
。
否则,p必须由左或右孩子覆盖。所以你可以再次使用covers()
函数(递归)来检查它。
最后一行(covers(root.left, p)
)的第一项检查左子项是否涵盖p
,第二项(covers(root.right, p)
)检查是否涵盖p
由合适的孩子。 OR运算符(||
)组合函数调用,如果一个(或两个)函数调用返回true
,则返回true
。
答案 3 :(得分:0)
该计划将首先评估covers(root.left, p)
。然后:
如果covers(root.left, p)
为true
,则整个表达式将评估为true
。您正在使用OR,因为其中一个条件为true
,因此不需要对covers(root.right, p)
进行评估。
如果covers(root.left, p)
为false
,则程序需要评估covers(root.right, p)
以确定表达式的结果。
您可以使用以下内容(伪代码)来理解这一点:
function doSomething() {
log 'hello world!'
};
x = false || doSomething(); // doSomething will be executed
x = true || doSomething(); // doSomething will NOT be executed
答案 4 :(得分:0)
这一行只是访问btree中所有节点的保证。
covers(root.left, p) || covers(root.right, p)