要求设计一个c++非递归代码,实现二叉树的后序遍历。 参考函数: struct TreeNode { char val; TreeNode* left; TreeNode* right; TreeNode(char x) : val(x), left(NULL), right(NULL) {} }; 输入说明 : 第一行:表示无孩子或指针为空的特殊分隔符 第二行:二叉树的先序序列(结点元素之间以空格分隔) 输出说明 : 第一行:后序遍历的结果 输入范例 : A B # C D # # E # # F # G # H # # 输出范例 : D,E,C,B,H,G,F,A
时间: 2024-02-25 19:51:39 浏览: 122
好的,根据你的要求,我已经设计好了一个c++非递归代码,实现二叉树的后序遍历。代码如下:
```c++
#include<iostream>
#include<stack>
#include<string>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
void postorder(TreeNode* root) {
if (root == NULL) {
return;
}
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* last = NULL;
while (cur != NULL || !st.empty()) {
if (cur != NULL) {
st.push(cur);
cur = cur->left;
}
else {
TreeNode* top = st.top();
if (top->right != NULL && last != top->right) {
cur = top->right;
}
else {
cout << top->val << " ";
last = top;
st.pop();
}
}
}
}
int main() {
string s;
getline(cin, s);
if (s == "#") {
cout << endl;
return 0;
}
TreeNode* root = new TreeNode(s[0]);
stack<TreeNode*> st;
st.push(root);
int i = 2;
while (i < s.size()) {
if (s[i] == '#') {
if (s[i - 1] == '#') {
st.pop();
}
else {
if (st.top()->left == NULL) {
st.top()->left = new TreeNode(s[i - 1]);
st.push(st.top()->left);
}
else {
st.top()->right = new TreeNode(s[i - 1]);
st.push(st.top()->right);
}
}
i += 2;
}
else {
if (s[i - 1] == '#') {
i += 2;
}
else {
if (st.top()->left == NULL) {
st.top()->left = new TreeNode(s[i - 1]);
st.push(st.top()->left);
}
else {
st.top()->right = new TreeNode(s[i - 1]);
st.push(st.top()->right);
}
i += 2;
}
}
}
postorder(root);
cout << endl;
return 0;
}
```
输入格式为先输入一个表示无孩子或指针为空的特殊分隔符,然后输入二叉树的先序序列(结点元素之间以空格分隔)。输出为后序遍历的结果。
阅读全文