你如何打印BST的顺序遍历?

时间:2016-07-13 21:50:42

标签: algorithm data-structures binary-search-tree computer-science graph-algorithm

“提供执行inorder树步行的非递归算法”。

这不仅仅是标准的深度搜索吗?我在网上看到这个问题的非递归解决方案都没有做任何真正类似DFS的事情(即使它们都使用了堆栈)......我的推理是不正确的?

这是我的伪代码:

public inOrder(Node root): create new Stack -> s create new boolean set -> visited s.push(root) while(!s.isEmpty()): currNode = s.pop() print(currNode) if(!visited.contains(currNode)): visited.add(currNode) if(currNode.right != null): s.push(currNode.right) if(currNode.left != null): s.push(currNode.left)

1 个答案:

答案 0 :(得分:0)

DFS不一定是有序的,尽管有序是DFS。请参阅wikipedia article。任何递归函数都可以使用堆栈非递归地实现(因为递归使用堆栈)。

正如您可以通过将代码与维基百科文章中的前,中,和后序遍历进行比较所看到的,您的代码遍历是预先订购的,因为它会在子代码之前打印父节点。为了使此实现成为有序遍历,必须首先打印左节点。这可以通过

来完成
  1. 检查--junit-directory是否为空且未访问
  2. if(1)为true,请推送currNode.leftcurrNode
  3. 如果(1)为false,请将currNode.left添加到访问集,打印currNode,然后按currNode(如果存在)。