我有一个二叉树,其内部节点由'AND'或'XOR'组成。叶节点也有数据成员。我需要使用堆栈(非递归)打印所有可能的路径。我已经搜索了遍历堆栈的遍历树,但由于无法应用后序,预订或顺序,因此其算法不适用于我的情况。我只是想不出任何算法,所以你能给我一些提示或一些链接,来源等吗?
示例树:
示例输出:奶酪(10),黄油(20),Filo Pastry(3),鸡蛋(1) - 总成本= 34
答案 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命令),即仅在没有左子项和右子项时打印节点即可。至于总成本,只需声明一个全局或静态变量,并在每次点击叶节点时为其添加值。
我会留下非递归部分让你想象。