输入包括1行字符串,长度不超过100。
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
abc##de#g##f###
c b e g d f a
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *lchild;
struct TreeNode *rchild;
}TreeNode;
// 前序遍历建立二叉树
void createTree(TreeNode **T, char *data, int *index)
{
char ch = data[*index];
*index += 1;
if (ch == '#')
{
*T = NULL;
}
else
{
*T = (TreeNode*)malloc(sizeof(TreeNode));
(*T)->data = ch;
createTree(&((*T)->lchild), data, index);
createTree(&((*T)->rchild), data, index);
}
}
void preOrder(TreeNode* T)
{
if (T == NULL)
{
return;
}
else
{
printf("%c ", T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void inOrder(TreeNode* T)
{
if (T == NULL)
{
return;
}
else
{
inOrder(T->lchild);
printf("%c ", T->data);
inOrder(T->rchild);
}
}
int main()
{
char s[110];
scanf("%s", &s);
TreeNode *T;
int index = 0;
createTree(&T, s, &index);
inOrder(T);
printf("\n");
return 0;
} #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char* BTDataType;
typedef struct BinaryTreeNode
{
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
BTDataType val;
} BTNode;
//初始化二叉树
BTNode* InitTree()
{
BTNode* treenode = (BTNode*)malloc(sizeof(BTNode));
if(treenode == NULL)
{
perror("malloc fail");
exit(-1);
}
treenode->right = NULL;
treenode->left = NULL;
treenode->val = NULL;
return treenode;
}
//用前序遍历构建二叉树
void PrevTreePush(char* ch,BTNode** root,int* i,size_t len)
{
if(*i > len)
{
return;
}
if(*(ch+(*i)) == '#')
{
(*i)++;
return;
}
*root = InitTree();
(*root)->val = ch+(*i);
(*i)++;
PrevTreePush(ch, &(*root)->left,i,len);
PrevTreePush(ch, &(*root)->right,i,len);
}
void InOrderTraversal(BTNode * root)
{
if(root == NULL)
return;
InOrderTraversal(root->left);
printf("%c ",*(root->val));
InOrderTraversal(root->right);
}
int main()
{
char ch[100] = "\0";
BTNode *root;
while (fgets(ch,100,stdin) != NULL)
{
int i = 0;
size_t len = strlen(ch);
len = len - 1;
PrevTreePush(ch,&root,&i,len);
InOrderTraversal(root);
}
return 0;
} #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BT {
char val;
struct BT* left;
struct BT* right;
} BT;
//创建节点
BT* getBT(char c) {
BT* tree = (BT*)malloc(sizeof(BT));
tree->val = c;
tree->left = tree->right = NULL;
return tree;
}
BT* setBT(char arr[],int len) {
//记录回去的路
BT* Stack[len];
//指向栈顶元素下一位置
int top = 0;
//创建root节点
BT* root = getBT(arr[0]);
//用于探路
BT* cmp = root;
//状态标记,为0创建左子树、为1创建右子树
//并用来记录遇到了几个空子树
int index = 0;
//从root的左子树开始构建
for (int i = 1; arr[i] != '\0';) {
//不为空就创建节点
if (arr[i] != '#') {
if (index == 0) {
cmp->left = getBT(arr[i]);
Stack[top++] = cmp;
cmp = cmp->left;
}
else if (index == 1) {
cmp->right = getBT(arr[i]);
Stack[top++] = cmp;
cmp = cmp->right;
index = 0;
}
i++;
}
else {
//统计沿途遇到了几个空子树
while (arr[i] == '#') {
index++;
i++;
}
//如果只是<=1,说明此根的左子树为空,就转去构建右子树
//如果>1,说明此根为叶子节点,就开始跳转
//该语句块的作用是:使cmp回到还没构建右子树的根处
if (index > 1) {
//减去左子树为空的计数后
//index此时的值表示遇到了几个空右子树
index--;
//开始往回走
while(index>0){
//遇到空子树就计数减1
if (cmp->right == NULL) {
index--;
}
cmp = Stack[--top];
}
//出循环了再来判断是否回到了右子树为空的根
//没有就继续往回走
while (top > 0 && cmp->right != NULL) {
cmp = Stack[--top];
}
}
//保证程序构建的是右子树
index = 1;
}
}
return root;
}
//递归实现中序遍历
void zx(BT* root) {
if (!root)
return;
zx(root->left);
printf("%c ", root->val);
zx(root->right);
}
int main() {
char arr[101]={0};
scanf("%s",arr);
if (arr[0] == '#')
printf(" ");
else {
int len = strlen(arr) - 1;
BT* root=setBT(arr, len);
zx(root);
}
return 0;
} #include<stdio.h>
#include<stdlib.h>
typedef struct BTNode
{
char val;
struct BTNode* left;
struct BTNode* right;
}BTNode;
struct BTNode* BinaryTreeCreate(char* p,int* k)
{
if(p[*k] == '#')
{
(*k)++;
return NULL;
}
BTNode* tmp=(BTNode*)malloc(sizeof(BTNode));
if(tmp == NULL)
{
exit(-1);
}
tmp->val=p[*k];
(*k)++;
tmp->left=BinaryTreeCreate(p,k);
tmp->right=BinaryTreeCreate(p,k);
return tmp;
}
void Inorder(struct BTNode* root)
{
if(root == NULL)
return;
Inorder(root->left);
printf("%c ",root->val);
Inorder(root->right);
}
int main()
{
char c[101];
while(scanf("%s",c) != EOF)
{
int k=0;
BTNode* root=BinaryTreeCreate(c,&k);
Inorder(root);
}
return 0;
} #include<stdio.h>
typedef struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char val;
}TNode;
TNode* CreateTree(char* str,int* i)
{
if(str[*i]=='#')
{
(*i)++;
return NULL;
}
TNode* root=(TNode*)malloc(sizeof(TNode));
if(root==NULL)
{
exit(-1);
}
root->val=str[*i];
(*i)++;
root->left=CreateTree(str,i);
root->right=CreateTree(str, i);
return root;
}
void InOrder(TNode* root)
{
if(root==NULL)
{
return;
}
InOrder(root->left);
printf("%c ",root->val);
InOrder(root->right);
}
int main()
{
char str[100]={0};
scanf("%s",str);
int i=0;
TNode* root=CreateTree(str,&i);//字符串前序遍历二叉树
InOrder(root);//对二叉树进行中序遍历,输出遍历结果。
return 0;
} #include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct TreeNode
{
char val;
struct TreeNode* left;
struct TreeNode* right;
}TNode;
TNode* BuildTree(char tree[],int* pi)
{
if(tree[*pi] == '#')
{
(*pi)++;
return NULL;
}
TNode* root = (TNode*)malloc(sizeof(TNode));
if(root == NULL)
{
printf("malloc fail\n");
exit(-1);
}
root->val = tree[*pi];
(*pi)++;
root->left = BuildTree(tree, pi);
root->right = BuildTree(tree, pi);
return root ;
}
void InOrder(TNode* root)
{
if(root == NULL)
return;
InOrder(root ->left);
printf("%c ",root ->val);
InOrder(root ->right);
}
int main()
{
char tree[100] = {0};
scanf("%s",tree);
int i = 0;
TNode* node = BuildTree(tree,&i);
InOrder(node);
return 0;
} #include <cstdio>
#include <cstring>
#include <stack>
char pre[101];
int main()
{
while (scanf("%s", pre) != EOF)
{
std::stack<char> s;
for (size_t i = 0; i < strlen(pre); i++)
{
if (pre[i] != '#')
s.push(pre[i]);
else
{
if (!s.empty())
{
printf("%c ", s.top());
s.pop();
}
}
}
printf("\n");
}
return 0;
}
//参考了题解
#include<stdio.h>
#include <stdlib.h>
const int N1=1e8+5;
const int N2=1e2+5;
int pos,len,t;//pos记录的是树的编号,t记录的是字符串的位置
char tree[N1];
char str[N2];
void create(int pos){
char c=str[t++];
if(c=='#'){
return ;
}
tree[pos]=c;
create(2*pos);//递归创建左子树
create(2*pos+1);
}
void order(int root){
if(tree[root]==0)
return ;
order(2*root);
printf("%c",tree[root]);
order(2*root+1);
}
int main(){
while(scanf("%s",str)!=EOF){
t=0;
create(1);
inorder(1);
}
return 0;
}
//或者用指针
#include <stdio.h>
#include <stdlib.h>
const int N=1e3+5;
int pos;
char str[N];
typedef struct treenode{
char data;
struct treenode* leftchild;
struct treenode* rightchild;
//treenode(char c):data(c),leftchild(NULL),rightchild(NULL){};
}treenode;
treenode *create(){
char c=str[pos++];
if(c=='#'){
return NULL;
}
treenode *root=(treenode*)malloc(sizeof(treenode));
root->data=c;
root->leftchild=create();
root->rightchild=create();
return root;
}
void inorder(treenode *root){
if(root==NULL){
return ;
}
inorder(root->leftchild);
printf("%c ",root->data);
inorder(root->rightchild);
}
int main(){
while(scanf("%s",&str)!=EOF){
pos=0;
treenode *root=(treenode*)malloc(sizeof(treenode));
root=create();
inorder(root);
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
char string[maxsize];
int i=0;
typedef struct tnode{
struct tnode*left;
struct tnode*right;
char ch;
}tnode;
int build(tnode*Node){
tnode *node;
int tag1=0,tag2=0;
i++;
if(string[i-1]=='\0')
exit(0);
if(string[i-1]!='#'){
Node->ch=string[i-1];
Node->left=(tnode*)malloc(sizeof(tnode));
tag1=build(Node->left);
if(tag1==-1) Node->left=NULL;
Node->right=(tnode*)malloc(sizeof(tnode));
tag2=build(Node->right);
if(tag2==-1) Node->right=NULL;
return 0;
}
else
return -1;
}
void midspan(tnode*Node){
if(Node!=NULL){
midspan(Node->left);
printf("%c ",Node->ch);
midspan(Node->right);
}
else return;
}
int main(){
tnode *Node;
int j=0,tag;
char c;
Node=(tnode*)malloc(sizeof(tnode));
while(scanf("%c",&c)!=EOF){
string[j++]=c;
while((c=getchar())!='\n')
string[j++]=c;
string[j]='\0';
tag=build(Node);
midspan(Node);
printf("\n");
}
} #include<stdio.h>
#include<stdlib.h>
char *g;//全局变量,指针g用来遍历字符串
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//递归建树,利用指针g读取字符并写入根结点数据域然后返回根结点
BiTree TreeBuild(){
if(*g=='#'){//读到#返回NULL
g++;//指针后移
return NULL;
}
else{//读到其它值
BiTNode *s=(BiTNode*)malloc(sizeof(BiTNode));//创建空节点
s->data=*g;//写入数据
g++;//指针后移
s->lchild=TreeBuild();//创建左子树
s->rchild=TreeBuild();//创建右子树
return s;//返回根结点
}
}
//递归打印中序遍历
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
}
int main(){
char Q[100];
int n;
scanf("%s",Q);//输入字符串
g=Q;//指针归零
BiTree T=TreeBuild();//建树
InOrder(T);//遍历输出
printf("\n");
return 0;
} #include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode {
char val;
struct TreeNode*left;
struct TreeNode*right;
}TNode;
void CreateTree(char*a, int* pi,TNode**root)
{
if (a[*pi] != '#')
{
TNode*p = (TNode*)malloc(sizeof(TNode));
p->val = a[*pi];
++(*pi);
*root = p;
}
else
{
++(*pi);
*root = NULL;
return;
}
CreateTree(a, pi,&(*root)->left);
CreateTree(a, pi, &(*root)->right);
}
void Inorder(TNode*root)
{
if (root == NULL)
return;
Inorder(root->left);
printf("%c ", root->val);
Inorder(root->right);
}
int main()
{
char str[100];
scanf("%s", str);
int i = 0;
TNode*root=NULL;
CreateTree(str, &i, &root);
Inorder(root);
return 0;
} #include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct TreeNode {
ElemType data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode, *BT;
// =============== function prototype ==============
void CreateTree(BT* bt);
void InOrderTraversal(BT bt, void (*visit) (TreeNode*));
// =============== function prototype ==============
void output(TreeNode* node) {
fprintf(stdout, "%c ", (*node).data);
}
int main(const int argc, const char** const argv) {
BT bt = NULL;
CreateTree(&bt);
InOrderTraversal(bt, output);
return 0;
}
// 只有深入理解二叉树及扩展二叉树, 二级指针和堆栈内存等知识。才能写出这短小精悍的函式!
void CreateTree(BT* bt) {
char ch;
fscanf(stdin, "%c", &ch);
if (ch == '#') {
*bt = NULL;
return;
}
*bt = (TreeNode*) malloc(sizeof(TreeNode));
(*bt)->data = ch;
CreateTree(&(*(*bt)).left);
CreateTree(&(*(*bt)).right);
}
void InOrderTraversal(BT bt, void (*visit) (TreeNode*)) {
if (!bt) return;
InOrderTraversal(bt->left, visit);
output(bt);
InOrderTraversal(bt->right, visit);
}