实验题目: 二叉树后序遍历的非递归算法。 实验说明:二叉树后序遍历的非递归算法:结点要入两次栈,出两次栈;为了区别同一个结点的两次出栈,设置标志flag,当结点进、出栈时,其标志flag也同时进、出栈。 设根指针为root,则可能有以下两种情况: ⑴ 若root!=NULL,则root及标志flag(置为1)入栈,遍历其左子树; ⑵ 若root=NULL,此时若栈空,则整个遍历结束;若栈不空,则表明栈顶结点的左子树或右子树已遍历完毕。若栈顶结点的标志flag=1,则表明栈顶结点的左子树已遍历完毕,将flag修改为2,并遍历栈顶结点的右子树;若栈顶结点的标志flag=2,则表明栈顶结点的右子树也遍历完毕,输出栈顶结点。请设计一个代码完成实验
时间: 2024-03-08 21:48:13 浏览: 78
非递归后序遍历-树及二叉树教程
下面是二叉树后序遍历的非递归实现代码:
```c++
#include <iostream>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void postorderTraversal(TreeNode* root) {
if (!root) return;
stack<pair<TreeNode*, int>> s;
s.push(make_pair(root, 1));
while (!s.empty()) {
auto& p = s.top();
auto node = p.first;
auto flag = p.second;
if (flag == 1) {
p.second = 2;
if (node->left) s.push(make_pair(node->left, 1));
}
else if (flag == 2) {
p.second = 3;
if (node->right) s.push(make_pair(node->right, 1));
}
else {
cout << node->val << " ";
s.pop();
}
}
}
int main() {
auto root = new TreeNode(1);
root->right = new TreeNode(2);
root->right->left = new TreeNode(3);
cout << "Postorder traversal: ";
postorderTraversal(root);
return 0;
}
```
该代码使用了一个pair来保存结点和标志flag,同时使用了一个栈来模拟递归过程。在每次循环中,取出栈顶元素,如果flag为1,则将左子树入栈并将flag置为2;如果flag为2,则将右子树入栈并将flag置为3;如果flag为3,则输出当前结点并将其出栈。
阅读全文