Depth First在具有2个以上子节点的树上搜索

时间:2013-09-29 05:08:20

标签: algorithm tree depth-first-search

我正在准备面试,我遇到了这个问题:

给定树结构的根。 getChildren()方法返回Node []数组,该数组包含该父项的所有子项。问题是检查给定的节点x是否在树中退出。我将如何以迭代和递归方式执行此操作?有人可以为它提供伪代码。我知道我们可以进行深度优先搜索,但我不知道如何为每个元素可以包含任意数量的子节点的树执行此操作。

1 个答案:

答案 0 :(得分:0)

您的递归方法可能如下所示

FUNCTION exists(Node target, Node root):

    Node[] children = root.getChildren()

    IF children NOT null:  //if there are children go on to visit each one
        FOR child IN children:
            IF exists(target,child):
                RETURN true
    ELSE: //the base case, when 'root' has no children check if it's the value
        RETURN root.value == target

    RETURN false //will only be reached from the first call to exists() if there hasn't been a match already

在Python中,这看起来像:

def exists(target,root):
    if isinstance(root,list):
        for child in root:
            if exists(target,child):
                return True
    else:
        return target == root
    return False

一些例子:

print exists(2,[[[2]]])
print exists(2,[[1,4,5,[2]]])
print exists(2,[0,0,0,[0,[1,1,1]]])
>>> 
True
True
False

python中的迭代将是

def existsNR(value,root):
    visitstack = [child for child in root]
    while visitstack:
        node = visitstack.pop()
        if isinstance(node,list):
            visitstack += node
        else:
            if node == value:
                return True
    return False 

这背后的逻辑是,你会检查每个有孩子的孩子,然后为每个有孩子的孩子,然后将孩子推到堆叠上,并移除父母和孩子。 #39;那些孩子(孩子)。为孩子检查这些并以类似的方式添加它们......直到你找到一个没有孩子的那个,你检查是否相等。