【问题标题】:Algorithm for a XOR tree traverse [closed]异或树遍历的算法[关闭]
【发布时间】:2015-02-23 23:19:20
【问题描述】:

我有一棵二叉树,它的内部节点由“AND”或“XOR”组成。叶节点也有 和 数据成员。我需要使用堆栈(非递归)打印所有可能的路径。我已经搜索了带有堆栈的遍历树,但它的算法不适用于我的情况,因为无法应用后序、前序或中序。我只是想不出任何算法,所以你能给我一些提示或一些链接、来源等吗?

示例树:

示例输出:Cheese(10)、Butter(20)、Filo Pastry(3)、Egg(1) - Total Cost = 34

【问题讨论】:

  • 先开发一个递归算法,然后确保它是正确的。完成后,将其转换为使用堆栈的非递归解决方案。
  • 另一个任务是什么?你在为此编写代码时运气更好吗

标签: c++ algorithm stack binary-tree xor


【解决方案1】:

一种递归方法是通过稍微修改它们来使用正常遍历(按顺序、前顺序或后顺序),即仅在节点没有左子节点和右子节点时打印节点。至于总成本,只需声明一个全局或静态变量,并在每次点击叶节点时为其添加值。

我将把非递归部分留给你想象。

【讨论】:

    【解决方案2】:

    从树结构和递归的角度思考是有帮助的,并认识到前序、中序和后序遍历是树上递归的三个实例。由于这是一个家庭作业,IMO 你应该问的真正问题是“你如何用堆栈模拟递归?”让我试着用一棵树上的插图来回答这个问题。说这棵树是这样的

                                 1
                                / \
                               2   3
    

    假设我们有一个函数recurse 以这种方式工作:

    def 递归节点: 在所有节点的孩子上递归(孩子) 做某事(节点)

    假设我们在 1 上调用 recurse。流程将是这样的:

    recurse 1
      recurse 2
      doSomething 2
      recurse 3
      doSomething 3
    doSomething 1
    

    现在让我们尝试迭代地编写它。

    def iterate root:
      //Let "stack" be the stack of nodes to process
      stack.push(root)
      while stack is not empty:
         curr_node = stack.top()
         if curr_node has a child that hasn't been processed:
           stack.push(child)
         else
           doSomething(curr_node)
           stack.pop()
    

    让我们检查iterate 1的行为:

    iterate 1
      stack 1
      stack 2 1
      doSomething 2
      stack 1
      stack 3 1
      doSomething 3
      stack 1
      doSomething 1
    

    如您所见,在递归和迭代解决方案中,在节点上调用 doSomething 的顺序是相同的。

    【讨论】:

    • 很好地解释了将递归转换为迭代
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多