二叉树的三种非递归遍历算法

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int TElemtype;

typedef struct BiTNode
{
	TElemtype Data;
	int IfVisited;
	struct BiTNode* Lchild, * Rchild;

}BiTNode;
typedef BiTNode* BiTree;

typedef BiTree ElemType;
typedef struct
{
	ElemType* base;
	int top;
	int SatckSize;
}Stack;
typedef Stack* PStack;

void Array_InOrder(BiTree Tree, void(*Visit)(BiTree))
{
	PStack S;
	S = (PStack)malloc(sizeof(Stack));
	InitStack(S, 100);
	BiTree t = Tree;
	while (t||!IsEmpty(S)) {
		if (t) {
			Push(S, (t));
			t = t->Lchild;
		}
		else {
			Pop(S, &t);
			PrintTree(t);
			t = t->Rchild;
		}
	}
}

void Array_PreOrder(BiTree Tree, void(*Visit)(BiTree))
{
	PStack S;
	S = (PStack)malloc(sizeof(Stack));
	InitStack(S, 100);
	BiTree t = Tree;
	while (t || !IsEmpty(S)) {
		if (t) {
			PrintTree(t);
			Push(S, t);
			t = t->Lchild;
		}
		else {
			Pop(S, &t);
			t = t->Rchild;
		}
	}
}
void Array_PostOrder(BiTree Tree, void(*Visit)(BiTree))
{
	PStack S;
	S = (PStack)malloc(sizeof(Stack));
	InitStack(S, 100);
	BiTree t = Tree;
	while (t || !IsEmpty(S))
	{
		if (t) {
			Push(S, t);
			t->IfVisited++;
			t = t->Lchild;
		}
		else {
			GetTop(S, &t);
			if (t->IfVisited == 2) {
				Pop(S, &t);
				Visit(t);
				t->IfVisited = 0;
				t = NULL;
			
			}
		
			else {
				t->IfVisited++;
				t = t->Rchild;
			}
		}
	}

}

int main()
{
	BiTree  N[9];

	for (int i = 0; i < 9; i++) { N[i] = CreateNode(i); N[i]->IfVisited = 0; }
	N[0]->Lchild = N[1]; N[0]->Rchild = N[2];
	N[1]->Lchild = N[3];
	N[2]->Lchild = N[4]; N[2]->Rchild = N[5];
	N[3]->Rchild = N[6];
	N[6]->Lchild = N[7]; N[6]->Rchild = N[8];

	Array_PostOrder(N[0], PrintTree);

}

void InitStack(PStack S, int size)
{
	if (!S) exit(1);
	if (size > 0) S->base = (ElemType*)malloc(sizeof(ElemType) * size);
	if (!S->base)exit(1);
	S->SatckSize = size;
	S->top = 0;

}

bool Pop(PStack S, ElemType* PopItem)
{
	if (S->top <= 0)
	{
		printf("Stack is empty\n"); return false;
	}
	S->top--;
	*PopItem = *(S->base + S->top);
	return true;
}

bool Push(PStack S, ElemType PushItem)
{
	if (S->top >= S->SatckSize)
	{
		printf("Stack is full\n"); return false;
	}
	*(S->base + S->top) = PushItem;
	S->top++;
	return true;
}

ElemType GetTop(PStack S, ElemType* TopItem)
{
	if (S->top <= 0)
	{
		printf("NO Item\n");

	}
	*TopItem = *(S->base + S->top - 1);
	return *TopItem;
}

bool IsEmpty(PStack S)
{
	if (S->top == 0) return true;
	else return false;
}
posted @ 2021-07-12 15:26  empty_thought  阅读(101)  评论(0)    收藏  举报