复习一次新的错误:
bug是寻找中序中的idx的时候判断的时候把== 写成 赋值=
题目描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。
示例1
输入
abc##de#g##f###
输出
c b e g d f a
题解1:
可以如上图画出这个二叉树,他的条件是给出了所有的空结点#,所以可以直接递归建树,对比另外镜面的那一题。
按照输入的前序遍历的序列建立二叉树,然后再对其进行中序遍历
注意根据前序遍历建立二叉树时,递归建树的时候新建Node *root
AC代码1:
//根据前序遍历构建二叉树
#include <iostream>
using namespace std;
struct Node{
char c;
Node *left;
Node *right;
}tree[120];
int loc,idx;
string pre;
Node *create(char c){
tree[loc].left=tree[loc].right=NULL;
tree[loc].c=c;
return &tree[loc++];
}
Node *buildbyPre(){
char c=pre[idx++];
if(c=='#') return NULL;
Node *root=create(c);
root->left=buildbyPre();
root->right=buildbyPre();
return root;
}
void inOrder(Node *root){
if(root->left!=NULL)
inOrder(root->left);
cout<<root->c<<" ";
if(root->right!=NULL)
inOrder(root->right);
}
int main(){
while(cin>>pre){
loc=0;
idx=0;
Node *root=buildbyPre();
inOrder(root);
cout<<endl;
}
return 0;
}
题解2:
正好去复习了一下二叉树的知识哈,在二叉树的非递归遍历的过程中,
前序遍历和中序遍历有相似的地方,他们都是利用堆栈完成了遍历的过程。
前序遍历是先输出再压栈,中序遍历是
入栈时访问是前序遍历!出栈时访问是中序遍历!
所以就可以将前序遍历转换成中序遍历,虽然好像还是有些迷惑(
AC代码2:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
string pre;
while(cin>>pre){
stack<char> s;
while(!s.empty()) s.pop();
for(auto it:pre){
if(it!='#'){
s.push(it);
}
else{
if(!s.empty()){
cout<<s.top()<<" "; //出栈的时候访问
s.pop();
}
}
}
}
}