以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’, 表示该二叉树是空树,否则该字符是相应结点的数据元素。读入相应先序序列,建立二叉链式存储结构的二叉树,然后中序遍历该二叉树并输出结点数据。
输入格式:
字符串形式的先序序列(即结点的数据类型为单个字符)
输出格式:
中序遍历结果
输入样例:
在这里给出一组输入。例如:
ABC##DE#G##F###
输出样例:
在这里给出相应的输出。例如:
CBEGDFA
参考了大佬们的代码,写一下博客方便复习
(有个问题没解决,为啥不能用string类型而用char)
#include<bits/stdc++.h>
using namespace std;
typedef struct node BinTree;
//创建字符行数组储存先序序列
char str[1000];
//i记录读到哪一个字符了
int i=0;
//建立树的结构
struct node
{
char data;
BinTree *Left;
BinTree *Right;
}*T;//T应该要是指针型的struct node
//创建树
BinTree *CreatBinTree ()
{
//读入#时说明该位置为空
//i++需要写在前面,防止str【i】==‘#’时不能在读入后面的
if(str[i++] == '#') return NULL;
//建立一个新的节点储存读入的字符
//new和malloc类似但是前者不需要初始化也不需要先确定所需内存空间大小
BinTree *T=new BinTree;
//前面判断是否为‘#’时先使i+1了但是此时data需要的是之前的字符
T->data=str[i-1];
//先序是:先-左-右,所有先创建左边的节点
T->Left=CreatBinTree();
T->Right=CreatBinTree();
//读完最后一个字符需要返回T的地址,方便进行中序遍历
return T;
}
void Inoder(BinTree *T)
{
if(T!=NULL)
{
Inoder(T->Left);
printf("%c",T->data);
Inoder(T->Right );
}
}
int main()
{
scanf("%s",str);
T=CreatBinTree();
Inoder(T);
return 0;
}