给定一个字符序列,请按照先序遍历的顺序构建对应的二叉树,其中‘#’表示空。然后输出二叉树的后序遍历序列 输入格式: 一个正整数N(N<1000),N个字符序列。 输出格式: N个字符序列(第i个字符序列为输入的第i个字符序列构建的二叉树的后序遍历序列)用c++
时间: 2024-05-06 19:18:06 浏览: 127
以下是代码实现:
```c++
#include <iostream>
#include <string>
#include <stack>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char v) : val(v), left(nullptr), right(nullptr) {}
};
TreeNode* buildTree(string s) {
stack<TreeNode*> stk;
TreeNode* root = nullptr;
for (char c : s) {
if (c == '#') { // 空节点
if (!stk.empty() && stk.top()->left == nullptr) {
stk.top()->left = new TreeNode(c);
} else if (!stk.empty() && stk.top()->right == nullptr) {
stk.top()->right = new TreeNode(c);
}
} else { // 非空节点
TreeNode* node = new TreeNode(c);
if (root == nullptr) { // 根节点
root = node;
}
if (!stk.empty() && stk.top()->left == nullptr) {
stk.top()->left = node;
} else if (!stk.empty() && stk.top()->right == nullptr) {
stk.top()->right = node;
}
stk.push(node);
}
// 逆推上层节点
while (!stk.empty() && stk.top()->left != nullptr && stk.top()->right != nullptr) {
stk.pop();
}
}
return root;
}
void postorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
TreeNode* root = buildTree(s);
postorderTraversal(root);
cout << endl;
}
return 0;
}
```
思路解析:
1. 遍历字符序列,遇到非空节点则创建新节点,并将其压入栈中;
2. 若栈顶元素的左右子节点都已经存在,则弹出该节点,直到栈顶元素的左右子节点有一个为空时才停止;
3. 输出二叉树的后序遍历序列。
时间复杂度:$O(n)$
空间复杂度:$O(n)$
阅读全文