【问题标题】:How do you print the inorder traversal of a BST?如何打印 BST 的中序遍历?
【发布时间】:2016-07-13 21:50:42
【问题描述】:

“给出一个执行中序树遍历的非递归算法”。

这不是标准的深度优先搜索吗?我在网上看到的解决这个问题的非递归解决方案都没有做任何真正类似于 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)

【问题讨论】:

  • 您可以通过选择文本并单击编辑器中的{ } 按钮来格式化您的代码。
  • 我希望非递归解决方案的打印结果与递归 bst_print(head) { if (head) { bst_print(head.left); print(head.value); bst_print(head.right); }} 相同。同意吗?

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


【解决方案1】:

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

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

  1. 检查currNode.left是否不为空且未被访问
  2. 如果 (1) 为真,则推送currNodecurrNode.left
  3. 如果 (1) 为假,则将currNode 添加到访问集,打印currNode,如果存在则推送currNode.right

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多