//【数据结构】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); //先序遍历二叉树
void Create(BinTree *T)
{
char ch=getchar(); //此时ch=字母或'#'
(*T)=(BinTree)malloc(sizeof(TNode));
(*T)->info=ch;
(*T)->lchild=NULL;
(*T)->rchild=NULL;
if((ch=getchar())=='('){ //每一个左括号出现都代表当前结点拥有左右孩子
Create(&((*T)->lchild));
Create(&((*T)->rchild));
}
else if(ch==')') //右括号后(一般)跟着一个逗号
ch=getchar(); //此时ch等于','或')'或'\n'
}
void PreOrderTraverse(BinTree T)
{
if(T){
printf("%c",T->info);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int main()
{
BinTree T=NULL;
Create(&T);
PreOrderTraverse(T);
return 0;
}
【后记】
1.最开始直接传指针进函数,输出一直为空emmm,后来改成传指针地址才AC。。。
2.考虑ch的各种情况那里改了很多遍,可读性较差。值得注意的是,每一个左括号出现都代表当前结点拥有左右孩子,递归多一层;每一个右括号后都跟着一个逗号(除了末尾可能会有几个连着的右括号)。
3.指针应初始化为NULL