作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力了解使用堆栈的 DFS 树遍历。我发现将递归解决方案转换为用于前序遍历的迭代解决方案非常直观。但是,我发现使用此链接很难理解后序遍历。 https://www.geeksforgeeks.org/iterative-postorder-traversal-using-stack/ .是否有一种直观且更简单的思考方式? 预购代码:
void iterativePreorder(node *root)
{
// Base Case
if (root == NULL)
return;
// Create an empty stack and push root to it
stack<node *> nodeStack;
nodeStack.push(root);
/* Pop all items one by one. Do following for every popped item
a) print it
b) push its right child
c) push its left child
Note that right child is pushed first so that left is processed first */
while (nodeStack.empty() == false)
{
// Pop the top item from stack and print it
struct node *node = nodeStack.top();
printf ("%d ", node->data);
nodeStack.pop();
// Push right and left children of the popped node to stack
if (node->right)
nodeStack.push(node->right);
if (node->left)
nodeStack.push(node->left);
}
}
最佳答案
有了前序遍历,代码
有了后序遍历,代码
所以不同的是,在进行后序遍历时,数据需要入栈,这样才能最后打印出来。有几种不同的方法可以实现这一点。一种方法是更改堆栈实现以区分子指针和数据指针。
弹出子指针时, Action 是
当一个数据指针被弹出时, Action 是
然后通过将根节点作为子指针压入开始遍历。
关于c++ - 使用一个堆栈的后序遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50359204/
我是一名优秀的程序员,十分优秀!