事情的起因还是因为数据结构课的一个课后题,
题目给出了很标准的表示法的一个样例:1(2(4,5),3);一目了然,非常标准,然而这天杀的题目居然在平台测试的时候还有这种玩意儿(一个简短的例子)1(2(3),4)。我:....... 很难想象这种不标准的括号表示法到底是谁在用。
废话不多说,上硬货。网上的几种括号表示法不出下面几种 :
①A(B,C(D,E)) 、A(B(C,)D) 、A(B(,C),D) ; ②A(B(C),D) ; ③A(B(D,#), C(#,E))
针对第三种这种很规范的表示法,我们很容易就能创建出二叉树,这里不详细介绍,主要提供前两种情况下二叉树的创建
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<cstdio>
#define MY_DEBUG(n) std::cout << #n << " = " << n << std::endl
using namespace std;
struct treenode
{
int data;
treenode *left;
treenode *right;
treenode(int number=0)
{
data = number;
left= nullptr;
right = nullptr;
}
};
struct node
{
int data;
};
struct tree
{
treenode *root;
void Init()
{
root = init_tree();
}
treenode *init_tree();
};
void createTree(treenode*& root, string& str) {
stack<treenode*> s3;
treenode *p = nullptr;
int k = 0;
node tmp;
root = nullptr;
std::string::size_type i = 0;
while (i < str.size()) {
switch (str[i]) {
case '(':
if (p != nullptr) {
s3.push(p);
}
k = 1;
break;
case ')':
if (!s3.empty()) {
p = s3.top(); // 更新 p 为栈顶元素的父节点
s3.pop();
}
break;
case ',':
k = 2;
break;
default:
p = new treenode; // 创建新节点
p->left = p->right = nullptr;
// [处理数字赋值给 p->data 的代码]
tmp.data = str[i]-'0';
//MY_DEBUG(str[i]);
std::string::size_type j=i+1;
if(str[j]>='0'&&str[j]<='9')
{
while(str[j]>='0'&&str[j]<='9')
{
tmp.data=tmp.data*10+str[j]-'0';//将字符串转换为数字
j++;i++;
}
i=j-1;
}
//MY_DEBUG(tmp.data);
p->data=tmp.data;
if (root == nullptr) {
root = p;
} else if (!s3.empty()) {
if (k == 1) s3.top()->left = p;
else if (k == 2) s3.top()->right = p;
}
}
i++;
}
}
void left2rightOrder(treenode *p)
{
if(p == nullptr)return ;
if(p != nullptr) {
// 如果节点是叶子节点,打印它的数据
if(p->left == nullptr && p->right == nullptr) {
cout << p->data << " ";
}
// 否则,递归遍历左子树和右子树
else {
left2rightOrder(p->left);
left2rightOrder(p->right);
}
}
}
void right2leftOrder(treenode *p)
{
if(p != nullptr) {
// 如果节点是叶子节点,打印它的数据
if(p->left == nullptr && p->right == nullptr) {
cout << p->data << " ";
}
// 否则,递归遍历左子树和右子树
else {
right2leftOrder(p->right);
right2leftOrder(p->left);
}
}
}
void printTree(treenode *root) {
if (!root) return;
queue<treenode*> q;
q.push(root);
while (!q.empty()) {
int levelSize = q.size();
vector<int> levelNodes;
for (int i = 0; i < levelSize; ++i) {
treenode* node = q.front();
q.pop();
levelNodes.push_back(node->data);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
for (int i = levelNodes.size() - 1; i >= 0; --i) {
cout << levelNodes[i] << " ";
}
}
}
void preorderTraversal(treenode* root)
{
if (root == nullptr) {
return;
}
cout << root->data << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main()
{
//freopen("in.txt", "r", stdin);
string str;
cin>>str;
tree * tree2 = new tree;
createTree(tree2->root,str);
left2rightOrder(tree2->root);cout<<endl;
right2leftOrder(tree2->root);cout<<endl;
printTree(tree2->root);
return 0;
}