写这道题的时候,测试了下网上广为流传的版本,我用复杂数据 a(b(c(h,i(c,d)),d(a,b)),e(f,g)) 测试时
结果错误
于是,我在此https://blog.csdn.net/qq_41727666/article/details/80624058(这位博主写的也存在问题)的基础上修改的算法,得到正确答案
给出修改后的代码
//【数据结构】NOJ015 建立二叉树的二叉链表存储结构
#include <stdio.h>
#include <stdlib.h>
//二叉链表
typedef char ElemType;
typedef struct TNode
{
ElemType info;
struct TNode *lchild;
struct TNode *rchild;
}TNode,*BinTree;
void Create(BinTree *T); //创建一个二叉树
void PreOrderTraverse(BinTree T); //先序遍历二叉树
char Str[200];
int i = 0;
void Create(BinTree *T,int floor)
{
//printf("%d floor\n",floor);
(*T)=(BinTree)malloc(sizeof(TNode));
(*T)->info=Str[i];
(*T)->lchild=NULL;
(*T)->rchild=NULL;
//printf("%c now\n",Str[i]);
if(Str[i+1]=='('){
i = i + 2; //每一个左括号出现都代表当前结点拥有左右孩子
Create(&((*T)->lchild), floor+1);
i = i +2;
Create(&((*T)->rchild),floor+1);
i = i + 1;
}
}
void PreOrderTraverse(BinTree T)
{
if(T){
printf("%c",T->info);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int main()
{
BinTree T=NULL;
int floor = 0;
scanf("%s",Str);
Create(&T, floor);
PreOrderTraverse(T);
return 0;
}
此为广为流传的版本
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct BinTreeNode
{
char data;
struct BinTreeNode *lchild;
struct BinTreeNode *rchild;
};
struct BinTreeNode *CreateTree()
{
char s1,s2;
struct BinTreeNode *q;
q=(struct BinTreeNode*)malloc(sizeof(struct BinTreeNode));
s1=getchar();
s2=getchar();
q->lchild=NULL;
q->rchild=NULL;
if(s1==',')
{
q->data=s2;
s1=getchar();
if (s1=='(')
{
q->lchild=CreateTree();
q->rchild=CreateTree();
}
}
else
{
q->data=s1;
if (s2=='(')
{
q->lchild=CreateTree();
q->rchild=CreateTree();
}
}
return q;
}
void PrintBinTree (struct BinTreeNode *p)
{
printf("%c",p->data);
if(p->lchild)
{
PrintBinTree(p->lchild);
}
if(p->rchild)
{
PrintBinTree(p->rchild);
}
}
int main()
{
BinTreeNode *head;
head=CreateTree();
PrintBinTree(head);
return 0;
}