//【数据结构】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