题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 * 表示
输出格式
二叉树的前序遍历。
输入样例
6
abc
bdi
cj*
d**
i**
j**
输出样例
abdicj
解法
误区
一开始想写一个递归查找算法,利用递归查找算法进行插入,再写一个递归遍历算法,但是后来发现它可能是不按顺序给出的节点,也就是可能按顺序读取会产生若干棵树,到最后才连起来
思路
因为根节点肯定不会是其他节点的子节点,所以可以先读取所有的节点信息,找到根节点,再递归建立整棵树
代码
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct node{
char data;
node* left;
node* right;
}node;
int n=0;
char nodeInfo[27][3]={};
void build(node* root){
int i=0;
for(i=1;i<=n;i++){
if(nodeInfo[i][0]==root->data)
break;
}
root->left=NULL;
root->right=NULL;
if(nodeInfo[i][1]!='*'){
node * templeft=(node*)malloc(sizeof(node));
templeft->data=nodeInfo[i][1];
root->left=templeft;
build(templeft);
}
if(nodeInfo[i][2]!='*'){
node * tempright=(node*)malloc(sizeof(node));
tempright->data=nodeInfo[i][2];
root->right=tempright;
build(tempright);
}
}
void preOrder(node* root){
if(root==NULL)
return;
cout<<root->data;
preOrder(root->left);
preOrder(root->right);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>nodeInfo[i][0]>>nodeInfo[i][1]>>nodeInfo[i][2];
}
node* root=(node*)malloc(sizeof(node));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(nodeInfo[i][0]==nodeInfo[j][1]||nodeInfo[i][0]==nodeInfo[j][2])
break;
if(j==n)
root->data=nodeInfo[i][0];
}
}
build(root);
preOrder(root);
return 0;
}