69,369
社区成员
发帖
与我相关
我的任务
分享
BiTree creat_tree(BiTree T)
{
char ch;
scanf("%c", &ch);
if ('#' == ch)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTree));
if (T==NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
T->data = ch;
creat_tree(T->lchild);//递归构建左子树
creat_tree(T->rchild);////递归构建右子树
}
return T;
}
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
char data;
struct node * lchild;//左孩子
struct node * rchild;//右孩子
}*BiTree, BiTNODE;
typedef struct Node
{
BiTree data;
struct Node * next;
} NODE, *PNODE;
typedef struct stack
{
PNODE ptop;
PNODE pbottom;
} STACK, *PSTACK;
BiTree creat_tree(BiTree &T);
void init_stack(PSTACK s);
void push_stack(PSTACK ps, BiTree val);
bool empty_stack(PSTACK ps);
BiTree pop_stack(PSTACK ps);
void traverse_zhongxu(BiTree root, PSTACK ps);
int main()
{
BiTree T = NULL;
T = creat_tree(T);
STACK s;
init_stack(&s);
traverse_zhongxu(T, &s);
fflush(stdin);
getchar();
}
/*先序构建二叉树*/
BiTree creat_tree(BiTree &T)
{
char ch;
scanf_s("%c", &ch);
getchar();
if ('#' == ch)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNODE));
if (T == NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
T->data = ch;
creat_tree(T->lchild);//递归构建左子树
creat_tree(T->rchild);////递归构建右子树
}
return T;
}
/*栈初始化*/
void init_stack(PSTACK ps)
{
ps->ptop = (PNODE)malloc(sizeof(NODE));//top指向新的节点
if (ps->ptop == NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
else
{
ps->pbottom = ps->ptop;//此时为空栈,因此bottom和top指向的位置一样
}
}
/*入栈*/
void push_stack(PSTACK ps, BiTree val)
{
PNODE PNEW = (PNODE)malloc(sizeof(NODE));
PNEW->data = val;//数据
PNEW->next = ps->ptop;//新节点在栈顶 指针域指向它下面的节点 实际为新节点入栈之前的栈顶top
ps->ptop = PNEW;//将top指向栈顶
}
/*判断空栈*/
bool empty_stack(PSTACK ps)
{
if (ps->ptop == ps->pbottom)
return true;
else
return false;
}
/*出栈*/
BiTree pop_stack(PSTACK ps)
{
BiTree t = NULL;
if (empty_stack(ps))//(形参)ps=&S(实参)
;
else
{
PNODE p = ps->ptop;//临时p指向栈顶
ps->ptop = p->next;//p->pnext将为出栈后的栈顶 所以ptop指向它
t = p->data;
free(p);//释放栈顶
}
return t;
}
/*非递归中序遍历*/
void traverse_zhongxu(BiTree root, PSTACK ps)
{
BiTree q = root;
if (q != NULL/* || empty_stack(ps)*/)
{
while (q != NULL)
{
push_stack(ps, q);
printf("%d\n", q->data);
q = q->lchild;
}
while (!empty_stack(ps))
{
q = ps->ptop->data;// 这里要把stack中存的BiTree指针取出来, 用来访问rchild
pop_stack(ps);
q = q->rchild;//这里访问rchild
if (q)
{
printf("%d\n", q->data);
}
}
}
}
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
char data;
struct node * lchild;//左孩子
struct node * rchild;//右孩子
}*BiTree,BiTNODE;
typedef struct Node
{
char data;
struct Node * next;
}NODE,*PNODE;
typedef struct stack
{
PNODE ptop;
PNODE pbottom;
}STACK,*PSTACK;
BiTree creat_tree(BiTree T);
void init_stack(PSTACK s);
void push_stack(PSTACK ps, char val);
bool empty_stack(PSTACK ps);
bool pop_stack(PSTACK ps);
void traverse_zhongxu(BiTree root, PSTACK ps);
int main()
{
BiTree T=NULL;
creat_tree(T);
STACK s;
init_stack(&s);
traverse_zhongxu(T, &s);
}
/*先序构建二叉树*/
BiTree creat_tree(BiTree T)
{
char ch;
fflush(stdin);
scanf("%c", &ch);
if ('#' == ch)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNODE));
if (T==NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
T->data = ch;
creat_tree(T->lchild);//递归构建左子树
creat_tree(T->rchild);////递归构建右子树
}
return T;
}
/*栈初始化*/
void init_stack(PSTACK ps)
{
ps->ptop = (PNODE)malloc(sizeof(NODE));//top指向新的节点
if (ps->ptop = NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
else
{
ps->pbottom = ps->ptop;//此时为空栈,因此bottom和top指向的位置一样
}
}
/*入栈*/
void push_stack(PSTACK ps, char val)
{
PNODE PNEW = (PNODE)malloc(sizeof(NODE));
PNEW->data = val;//数据
PNEW->next = ps->ptop;//新节点在栈顶 指针域指向它下面的节点 实际为新节点入栈之前的栈顶top
ps->ptop = PNEW;//将top指向栈顶
}
/*判断空栈*/
bool empty_stack(PSTACK ps)
{
if (ps->ptop == ps->pbottom)
return true;
else
return false;
}
/*出栈*/
bool pop_stack(PSTACK ps)
{
if (empty_stack(ps))//(形参)ps=&S(实参)
return false;
else
{
PNODE p = ps->ptop;//临时p指向栈顶
ps->ptop = p->next;//p->pnext将为出栈后的栈顶 所以ptop指向它
free(p);//释放栈顶
}
}
/*非递归中序遍历*/
void traverse_zhongxu(BiTree root,PSTACK ps)
{
BiTree q = root;
while (q != NULL||empty_stack(ps))
{
while (q != NULL)
{
push_stack(ps, q->data);
q = q->lchild;
}
while (empty_stack(ps))
{
pop_stack(ps);
q = q->rchild;
}
}
}