今天在看到别人写的代码以后,发现了自己写的代码的问题,自己只是顾着实现代码的算法逻辑,却忽视了代码的优美、代码的复用。我想起了我以前一位老师说的—-真正的把每一行程序当成一行一行诗句来写!这样才是真正的值得留下来给大家分享的东西。受教了,抱歉 !
好吧上题目:
题目描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。
示例1
输入
输出
c b e g d f a
其实我们可以发现其实这道题就是一道简单的数据结构的二叉树的建立于遍历。
我们来看一看题目中可以提取出什么东西:
①输出每个字符后面都有一个空格
②每个为空的叶子节点都是用’#‘来表示,整个式子刚好是一颗树。
上代码:
#include<iostream>
#include<string>
using namespace std;
string::iterator iter;
struct node {
node(char a)
:c(a)
, right(NULL)
, left(NULL)
{}
char c;
node *right;
node *left;
};
node * Create()
{
char x = *iter++;
/*
*因为每一个节点都会有符号(即使为空)
*所一不担心迭代器的越界访问
*/
if (x == '#')
{
return NULL;
}
node *root = new node(x);
root->left = Create();
root->right = Create();
return root;
}
void MidOrderTra(node * root)
{
/*
*其实我觉得所谓的先序,中序,后序遍历
*就是输出位置和left 、 right 递归的相对位置
*/
if (!root) return;
MidOrderTra(root->left);
cout << root->c<<" ";
MidOrderTra(root->right);
delete(root);
}
int main()
{
string str;
while (cin >> str)
{
/*
*string 的 iterator 指向string 的起始节点
*/
iter = str.begin();
node * root = Create();
MidOrderTra(root);
cout << endl;
}
return 0;
}