69,382
社区成员
发帖
与我相关
我的任务
分享
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreatBiTree(BiTree &T) // BiTree &T
{
TElemType ch;
scanf("%c",&ch);
if(ch==" ") T=NULL:
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(-1);
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void CreatBiTree(BiTree *T)//?? &T与*T
{ //递归先序建树
TElemType ch;
scanf("%c",&ch);
if(ch==' ')
{
(*T)->data=NULL;
}
else
{
if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(&((*T)->lchild)); //报错了
CreatBiTree(&((*T)->rchild));
}
}
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_INT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef char TElemType;
typedef int Status;
typedef char SElemType;
//二叉树的二叉链表存储表示
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;
typedef struct {
BiTree *base;
BiTree *top;
int stacksize; //当前已分配的存储空间
}SqStack;
Status InitStack(SqStack &S) {
S.base = (BiTree *) malloc(sizeof(BiTree));
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INT_SIZE;
return OK;
}
Status GetTop(SqStack &S, BiTree &e) {
//若栈不空,则用e返回S的栈顶元素
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}
Status Push(SqStack &S, BiTree e) {
//插入元素e为栈顶元素
if(S.top - S.base >= S.stacksize) { //若栈满,则追加存储空间
S.base = (BiTree *) realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(BiTree));
if(!S.base) return ERROR;
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top = e;
S.top++;
return OK;
}
Status Pop(SqStack &S,BiTree &e) {
//删除S的栈顶元素,并用e返回
if(S.base == S.top) return ERROR;
S.top--;
e = *S.top;
return OK;
}
Status StackEmpty(SqStack S) {
// 若栈S为空栈,则返回TRUE,否则返回FALSE
if(S.top == S.base) return TRUE;
else return FALSE;
}
Status CreateBiTree(BiTree &T) {
//按先序次序输入二叉树中结点的值
//构造二叉链表表示的二叉树T
char ch;
scanf("%c",&ch);
if(ch == '0') T = NULL;
else {
if(!(T = (BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return OK;
} //CreateBiTree
Status PreOrderTraverse(BiTree T) {
//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit
SqStack S;
InitStack(S);
BiTree p;
p = T;
while(p || !StackEmpty(S)) {
if(p) {
printf("%c",p->data);
Push(S,p);
p = p->lchild; //根指针进栈,遍历左子树
}
else{ //根指针退栈,访问根结点,遍历右子树
Pop(S,p);
p = p->rchild;
}
}//while
return OK;
} //InOrderTraverse
Status InOrderTraverse(BiTree T) {
//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit
SqStack S;
InitStack(S);
BiTree p;
p = T;
while(p || !StackEmpty(S)) {
if(p) {
Push(S,p);
p = p->lchild; //根指针进栈,遍历左子树
}
else{ //根指针退栈,访问根结点,遍历右子树
Pop(S,p);
printf("%c",p->data);
p = p->rchild;
}
}//while
return OK;
} //InOrderTraverse
Status PostOrderTraverse(BiTree T) {
//运用非递归的方法遍历二叉树 数据结构为栈
SqStack S;
InitStack(S);
BiTree p, lastvisit;
p = T;
lastvisit = NULL;
while(p || !StackEmpty(S)) {
while(p) {
Push(S,p);
p = p->lchild;
}
Pop(S,p);
S.top++;
if(p->rchild == NULL || p->rchild == lastvisit) {
printf("%c",p->data);
S.top--;
lastvisit = p;
p = NULL;
}
else {
p = p->rchild;
}
}
return OK;
}
void main() {
printf("请输入先序建立二叉树所需要的数据(例如ABD0000):");
BiTree t;
CreateBiTree(t);
printf("中序输出为:");
InOrderTraverse(t);
printf("\n");
printf("先序输出为:");
PreOrderTraverse(t);
printf("\n");
printf("后序输出为:");
PostOrderTraverse(t);
printf("\n");
}
/*
A
/ \
B 0
/ \
D 0
/ \
0 0
*/
Status CreateBiTree(BiTree &T) {
//按先序次序输入二叉树中结点的值
//构造二叉链表表示的二叉树T
char ch;
scanf("%c",&ch);
if(ch == '0') T = NULL;
else {
if(!(T = (BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return OK;
} //CreateBiTree
void CreatBiTree(BiTree *T)//?? &T与*T
{ //递归先序建树
TElemType ch;
scanf("%c",&ch);
if(ch==' ')
{
(*T)->data=NULL;
}
else
{
if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
(*T)->data=ch;
CreatBiTree(T->lchild); //报错了
CreatBiTree(T->rchild);
}
}