Haskell中树形结构搜索函数的执行顺序疑问
Haskell多叉树搜索函数的执行顺序解析
首先修正你测试用例里的笔误:Leer应该是定义里的Empty,修正后的测试用例:
test::Bool test = searchValueTree (Node 5 [Node 4 [Node 3 [Empty]], Node 7 [Empty], Empty]) 3
你的核心疑问本质是深度优先搜索的执行逻辑,结合Haskell的||短路求值特性,执行顺序可以拆解为:
执行规则
当helperTree (x:xs) value运行时:
- 优先执行
searchValueTree x value——这是进入x对应的子树做深度优先搜索:- 如果当前子树的节点值匹配目标,直接返回
True,||短路,不会执行后续代码; - 如果当前子树的节点值不匹配,会调用
searchValueTree里的helperTree list valueSearch,遍历x的所有子节点,把整个x子树搜完。
- 如果当前子树的节点值匹配目标,直接返回
- 只有当
x的整个子树都搜完且没找到目标(searchValueTree x value返回False),才会执行helperTree xs value,也就是去遍历x的兄弟节点。
用测试用例举例(找3)
执行流程链:
- 调用
searchValueTree (Node5 [...]) 3→ 5≠3,触发helperTree [Node4, Node7, Empty] 3 helperTree取第一个元素Node4,调用searchValueTree (Node4 [...])3→4≠3,触发helperTree [Node3]3helperTree取第一个元素Node3,调用searchValueTree (Node3 [Empty])3→3==3,直接返回True,整个搜索终止。
假设找不存在的8
执行流程会走完所有子树:
- 搜Node5→Node4→Node3→Empty(返回False)→回到Node3的helperTree(子节点空,返回False)→Node4的searchValueTree返回False→回到上层helperTree,搜Node7→Node7→Empty(返回False)→Node7的helperTree返回False→回到上层helperTree,搜Empty(返回False)→最终整个函数返回False。
简单说:先搜完当前节点的整个子树,再去搜它的兄弟节点。
内容的提问来源于stack exchange,提问作者zeppal
相关产品推荐
相关产品推荐

