牛客网计算机考研复试-KY11-二叉树的遍历
题目链接:点这里
题目描述:
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
思路1:
根据先序遍历建立二叉树,在中序遍历输出结果。
代码1:
#include <bits/stdc++.h>
using namespace std;
string s;
int i;
struct TreeNode{
char data;
struct TreeNode *left,*right;
};
TreeNode* creat(){
char c = s[i++];
///不用考虑s[i]超内存,有#控制,访问不到s[s.length()]
if(c=='#')
return NULL;
TreeNode *root = new TreeNode();
root->data = c;
root->left = creat();
root->right = creat();
return root;
}
void inOrderTraversal(TreeNode* node){
if(node==NULL)
return;
inOrderTraversal(node->left);
cout << node->data << " ";
inOrderTraversal(node->right);
}
int main(){
while(cin >> s){
i = 0;
TreeNode *root = creat();
inOrderTraversal(root);
}
return 0;
}
思路2:
评论里有一个很棒的思路:二叉树的先序遍历入栈,出栈顺序就是它的中序遍历(好像王道408数据结构有讲过)。
代码2:
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
while(cin >> s){
stack<char> c;
for(int i=0;i<s.length()-1;i++){
if(s[i]=='#'){
cout << c.top() << " ";
c.pop();
}
else{
c.push(s[i]);
}
}
cout << endl;
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步