https://blog.csdn.net/SimonCoder
题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 nn 行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 *
表示
输出格式
二叉树的前序遍历。
输入输出样例
输入 #1
6 abc bdi cj* d** i** j**
输出 #1
abdicj
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<iostream>
using namespace std;
struct BinTree{
char data;
BinTree *lchild, *rchild;
} *root;
BinTree* CreateTree(char bintree_index[][2], char head){
if(head=='*') return NULL;
BinTree* p;
p = (BinTree *)malloc(sizeof(BinTree));
p->data = head;
p->lchild = CreateTree(bintree_index, bintree_index[head-'a'][0]);
p->rchild = CreateTree(bintree_index, bintree_index[head-'a'][1]);
return p;
}
void PreOrder(BinTree* head){
if(head){
printf("%c", head->data);
PreOrder(head->lchild);
PreOrder(head->rchild);
}
}
void Release(BinTree* head){
if(head){
Release(head->lchild);
Release(head->rchild);
free(head);
}
}
int main(){
int n;
char bintree_index[26][2];
while(scanf("%d", &n)!=EOF){
getchar(); // 吸收换行符
char r;
for(int i=0; i<n; i++)
{
char fa, lch, rch;
//scanf("%c %c %c", &fa, &lch, &rch); //用scanf之前会MLE,将scanf改为cin就可以AC,?
cin>>fa>>lch>>rch;
getchar(); // 吸收换行符
bintree_index[fa-'a'][0] = lch;
bintree_index[fa-'a'][1] = rch;
if(i==0) r = fa;
}
root = CreateTree(bintree_index, r);
PreOrder(root); printf("\n");
Release(root);
}
return 0;
}