设计一个算法,以括号表示法,输出一棵二叉树,用c++
时间: 2024-10-25 14:06:06 浏览: 33
c++ 计算表达式结果(二叉树、后缀表达式)
4星 · 用户满意度95%
设计一个算法将括号序列转换成对应的二叉树可以采用递归的方式来实现,这是常见的构建二叉树问题,特别是对于前序遍历(left-root-right)的形式。这里是一个简单的C++实现:
```cpp
#include <string>
#include <stack>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* buildTree(std::string s) {
if (s.empty()) return nullptr;
std::stack<TreeNode*> nodes; // 用于存储节点
for (size_t i = 0; i < s.size(); ++i) {
char c = s[i];
if (c == '(') { // 遇到左括号,压入空节点
nodes.push(nullptr);
} else if (c == ')') { // 遇到右括号,创建当前节点并连接左右子树
TreeNode* root = nodes.top();
nodes.pop();
if (!root || !nodes.empty()) { // 如果当前有根节点或者栈未空,说明存在左子树
TreeNode* left = nodes.top();
nodes.pop();
root->left = left;
if (!nodes.empty()) { // 连接右子树
TreeNode* right = nodes.top();
nodes.pop();
root->right = right;
}
}
} else { // 遇到数字,创建新的节点作为当前节点
TreeNode* numNode = new TreeNode(c - '0');
if (!nodes.empty()) {
TreeNode* parent = nodes.top();
nodes.pop();
if (!parent->left) {
parent->left = numNode;
} else {
parent->right = numNode;
}
} else {
nodes.push(numNode); // 作为当前待添加的根节点
}
}
}
return nodes.top(); // 返回根节点
}
};
```
这个算法首先检查输入字符串是否为空,然后遍历每个字符。遇到左括号就压入一个空节点,遇到右括号则从栈顶取出两个节点分别设置为当前节点的左右孩子,并继续处理后续的括号。遇到数字则创建一个新的TreeNode,将其插入到合适的子树位置。
阅读全文