XOR树遍历的算法

时间:2014-12-26 18:31:52

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

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

示例树:

enter image description here

示例输出:奶酪(10),黄油(20),Filo Pastry(3),鸡蛋(1) - 总成本= 34

2 个答案:

答案 0 :(得分:2)

根据树结构和递归进行思考是有帮助的,并且认识到预订,有序和后序遍历是树上递归的三个实例。由于这是一个家庭作业,IMO真正的问题是你应该问“你怎么能用堆栈来模拟递归?”让我试着用树上的插图来回答这个问题。假设树看起来像这样

                             1
                            / \
                           2   3

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

def recurse node:   递归(孩子)所有节点的孩子   doSomething的(节点)

假设我们打电话给recurse 1.流程将是:

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的顺序是相同的。

答案 1 :(得分:0)

递归方法是通过修改稍微使用正常遍历(in,pre或post命令),即仅在没有左子项和右子项时打印节点即可。至于总成本,只需声明一个全局或静态变量,并在每次点击叶节点时为其添加值。

我会留下非递归部分让你想象。