/*
* Date: 2013/3/11
* PostOrder Iteration Method
* NolanJian
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct treenode;
struct node;
typedef struct treenode TreeNode;
typedef TreeNode *TreePointer;
typedef struct node Node;
typedef Node *NodePointer;
void Push(TreePointer Tp, NodePointer *top);
void Pop(NodePointer * top);
void PostOrder(TreePointer H);
TreePointer Create(char* preorder, char* inorder, int n);
struct treenode {
char data;
TreePointer LeftChild, RightChild;
};
struct node {
TreePointer Tp;
NodePointer Next;
};
int main() {
TreePointer root;
char pre[] = "ABCDEFGHIJKLMNOP";
char in[] = "DCEFBGHAJILKNOMP";
root = Create(pre, in, strlen(pre));
PostOrder(root);
return 0;
}
//这次编程的目的:PostOrder非递归实现
void PostOrder(TreePointer H) {
TreePointer p = H, q; //H是树根节点指针, p是操作指针, q是标记指针
NodePointer Top = NULL; //Top是栈顶指针,这次的栈是用链表实现的
int flag; //flag的作用的出栈许可, 0不可, 1允许
do {
while(p) { //左子树总是不断入栈的
Push(p, &Top); //Push是入栈函数
p = p->LeftChild;
}
q = NULL; //标记指针q的复位处,不能总指着一个地方,
//而且q指向的地方有可能是左子树
//就算q指向右子树,也有可能为NULL
flag = 1; //当左子树已经最大限度入栈后,允许有出栈操作
while(Top && flag) { //如果栈是非空的和允许出栈
p = Top->Tp; //获得栈顶元素
if(p->RightChild == q) {//如果栈顶元素的右子树已经访问过,即等于标记q
Pop(&Top); //则出栈
q = p; //并标记p指向的地方已经访问过
}
else { //如果栈顶元素的右子树没有访问过,即不等于标记q
p = p->RightChild;
flag = 0; //既然右子树还没访问,则肯定不允许有出栈操作
}
}
}while(Top); //结束条件是空栈
}
void Push(TreePointer Tp, NodePointer *top) {
NodePointer tmp = (NodePointer)malloc(sizeof(Node));
tmp->Next = NULL;
tmp->Tp = Tp;
if(*top == NULL)
*top = tmp;
else {
tmp->Next = (*top);
*top = tmp;
}
}
void Pop(NodePointer * top) {
printf("%c", (*top)->Tp->data);
*top = (*top)->Next;
}
TreePointer Create(char* preorder, char* inorder, int n) {
char* p, *q;
int i, j, m;
TreePointer root;
if(n <= 0)
return NULL;
root = (TreePointer)malloc(sizeof(TreeNode));
root->data = preorder[0];
root->LeftChild = root->RightChild = NULL;
i = 0;
while(i < n) {
if(preorder[0] == inorder[i])
break;
i++;
}
p = preorder + 1;
q = inorder;
root->LeftChild = Create(p, q, i);
p = preorder + i + 1;
q = inorder + i + 1;
root->RightChild = Create(p, q, n - i - 1);
return root;
}
后序非递归
最新推荐文章于 2020-12-06 10:47:58 发布