设计一个c++非递归代码,实现二叉树的后序遍历输出。输入为二叉树前序遍历结果(结点元素之间以空格分隔),符号#表示无孩子或指针为空的特殊分隔符。输入范例:A B # C D # # E # # F # G # H # #。输出范例:D,E,C,B,H,G,F,A
时间: 2024-02-25 21:51:54 浏览: 63
C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)
5星 · 资源好评率100%
好的,下面是代码实现:
```c++
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<char>& preorder) {
if (preorder.empty()) {
return NULL;
}
char val = preorder.front();
preorder.erase(preorder.begin());
if (val == '#') {
return NULL;
}
TreeNode* node = new TreeNode(val);
node->left = buildTree(preorder);
node->right = buildTree(preorder);
return node;
}
void postOrder(TreeNode* root) {
if (!root) {
return;
}
stack<TreeNode*> s;
TreeNode* lastVisited = NULL;
while (root || !s.empty()) {
while (root) {
s.push(root);
root = root->left;
}
TreeNode* topNode = s.top();
if (!topNode->right || topNode->right == lastVisited) {
cout << topNode->val << " ";
s.pop();
lastVisited = topNode;
} else {
root = topNode->right;
}
}
}
int main() {
vector<char> preorder = {'A', 'B', '#', 'C', 'D', '#', '#', 'E', '#', '#', 'F', '#', 'G', '#', 'H', '#', '#'};
TreeNode* root = buildTree(preorder);
postOrder(root);
return 0;
}
```
代码思路是用一个栈来模拟递归的过程,先将根节点以及左子树全部入栈,然后不断弹出栈顶元素,判断其右子树是否为空或者已被访问过,如果是则输出该节点并将其标记为已访问,否则将右子树入栈。
阅读全文