版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
7-5 Tree Traversals Again (25 分)
这道题给出的是利用Stack来进行中序遍历的操作,让我们根据操作来得到后序遍历的结果。
我的思路是根据题目给出的操作,反向建立二叉树。 最后后序遍历得到答案。
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TreeNode *Tree; //树
struct TreeNode{
int Data;
Tree Left,Right;
};
typedef struct node *Stack; //栈
struct node{
Tree Node;
Stack Next;
};
Tree CreateTreeNode(int X){
Tree q = (Tree)malloc(sizeof(struct TreeNode));
q->Data = X;
q->Left = q->Right = NULL;
return q;
}
Stack CreateStack(){
Stack q = (Stack)malloc(sizeof(struct node));
q->Node = NULL; //树
q->Next = NULL; //下一结点
return q;
}
void Push(Stack p,Tree node){
Stack ptr = CreateStack();
ptr->Next = p->Next;
p->Next = ptr;
ptr->Node = node;
}
Tree Pop(Stack p){
Tree q;
Stack ptr = p->Next;
p->Next = ptr->Next;
q = ptr->Node;
free(ptr);
return q;
}
Tree GetTop(Stack p){
if(p->Next)
return p->Next->Node;
else
return NULL;
}
int Flag = 1; //控制打印
void PostTraversals(Tree q){
if(q->Left) PostTraversals(q->Left);
if(q->Right) PostTraversals(q->Right);
if(Flag){
printf("%d",q->Data);
Flag = 0;
}
else
printf(" %d",q->Data);
}
int main(){
int n,num,count = 0,flag = 1;
Stack stack = CreateStack();
Tree tree = CreateTreeNode(0);
Tree PopNode;
scanf("%d",&n);
for(int i=0;i<2*n;i++){
char string[5];
scanf("%s",string);
if(flag){
scanf("%d",&num);
tree->Data = num;
Push(stack,tree);
flag = 0;
continue;
}
if(strcmp(string,"Push") == 0){
//Stack空,入栈
scanf("%d",&num);
Tree New = CreateTreeNode(num);
if(count){ //Push前面有Pop,PopNode
if(!PopNode->Left){
PopNode->Left = New;
}
else if(!PopNode->Right){
PopNode->Right = New;
}
Push(stack,New);
}
else { //Push前面是Push,用栈的Top元素
Tree Temp = GetTop(stack);
if(!Temp->Left){
Temp->Left = New;
}
else if(!Temp->Right){
Temp->Right = New;
}
Push(stack,New);
}
count = 0;
}
else
{
PopNode = Pop(stack);
count = 1;
}
}
PostTraversals(tree);
system("pause");
return 0;
}