#include <stdio.h>
#include <stdlib.h>
typedef struct TREE {
char data;
struct TREE* Lchild;
struct TREE* Rchild;
int flag;
}TREE,*PTREE;
typedef struct STACK {
struct TREE* data;
struct STACK* next;
}STACK,*PSTACK;
PSTACK init() {
PSTACK S = (PSTACK)malloc(sizeof(STACK));
S->data = NULL;
S->next = NULL;
return S;
}
int isempty(PSTACK S) {
if (S->next == NULL) {
return 1;
}
else
{
return 0;
}
}
void push(PSTACK S, PTREE T) {
PSTACK NEWNODE = (PSTACK)malloc(sizeof(STACK));
NEWNODE->data = T;
NEWNODE->next = S->next;
S->next = NEWNODE;
}
PSTACK pop(PSTACK S) {
if (isempty(S)) {
return;
}
PSTACK temp = S->next;
S->next = temp->next;
return temp;
}
void create(TREE** T) {
char data;
scanf("%c", &data);
getchar();
if (data != '#') {
*T = (PTREE)malloc(sizeof(TREE));
(*T)->data = data;
(*T)->flag = 0;
create(&(*T)->Lchild);
create(&(*T)->Rchild);
}
else
{
*T = NULL;
}
}
PSTACK GetTop(PSTACK S) {
if (isempty(S)) {
return NULL;
}
else
{
PSTACK node = S->next;
return node;
}
}
void postorder(PSTACK S, PTREE T) {
PTREE node = T;
while (node || !isempty(S)) {
if (node) {
push(S, node);
node = node->Lchild;
}
else
{
PTREE top = GetTop(S)->data;
if (top->Rchild && top->Rchild->flag == 0) {
top = top->Rchild;
push(S,top);
node = top->Lchild;
}
else
{
top = pop(S)->data;
printf("%c", top->data);
top->flag = 1;
}
}
}
}
int main() {
PTREE T;
create(&T);
PSTACK S = init();
postorder(S, T);
return 0;
}
二叉树的非递归遍历(后序)
最新推荐文章于 2024-10-03 13:32:34 发布