数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)

一、非递归前序算法遍历思想:

        (1)节点指针非空时,或堆栈非空时,进入下面步骤:如果节点指针非空,首先访问”根”节点,转(2)节点指针为空时,转(3); 

        (2)然后将访问过得节点指针(一个”根”的指针)进栈,再将指针指向访问过得节点的左子树的根,转(1);

        (3)堆栈非空时,退栈,指针指向退栈节点的右子树节点,转(1)。节点指针为空且堆栈为空时,结束算法,完成遍历。

二、代码实现

#include<stdio.h>
#include<stdlib.h>

typedef char EType; 

struct BinaryTreeNode//定义节点
{
	EType data;
	struct BinaryTreeNode *LChild;
	struct BinaryTreeNode *RChild;
};
typedef BinaryTreeNode BinaryTree;

typedef struct SType
{
	BinaryTreeNode *ptr;//存放在栈中的是指向节点的指针
}SType;

typedef struct Stack
{
	SType *element;//线性栈,而不是链式栈
	int top;
	int MaxSize;
}Stack;

void CreatStack(Stack &S,int MaxStackSize);
bool IsEmpty(Stack &S);
bool IsFull(Stack &S);
bool GetTop(Stack &S,SType &result);
bool Pop(Stack &S,SType &result);
bool Push(Stack &S,SType &x);
void CreatBiTree(BinaryTreeNode **BT);
void PreOrderNoRecursive(BinaryTreeNode *BT);

int main()
{
    BinaryTreeNode *BT = NULL;//定义指向根节点的指针
	CreatBiTree(&BT);//为了给BT赋值,这里要用二级指针
	printf("前序遍历二叉树非递归算法输出为:");
	PreOrderNoRecursive(BT);//前序遍历二叉树非递归算法实现函数
	printf("\n");
	return 0;
}

void CreatStack(Stack &S,int MaxStackSize)//建栈
{
	S.MaxSize = MaxStackSize;
	S.element = new SType[S.MaxSize];
	S.top = -1;
}

bool IsEmpty(Stack &S)//判断栈是否为空
{
	if(S.top == -1)
		return true;
	return false;
}

bool IsFull(Stack &S)//判断栈是否满,此程序用不到
{
	if(S.top >= S.MaxSize-1)
		return true;
	return false;
}

bool GetTop(Stack &S,SType &result)//得到栈顶的值,此程序用不到
{
	if(IsEmpty(S))
		return false;
	result = S.element[S.top];
	return true;
}

bool Pop(Stack &S,SType &result)//退出栈顶元素到result
{
	if(IsEmpty(S))
		return false;
	result = S.element[S.top];
	S.top--;
	return true;
}

bool Push(Stack &S,SType &x)//把x压入栈中
{
    if(IsFull(S))
		return false;
	S.top++;
	S.element[S.top] = x;
	return true;
}

void CreatBiTree(BinaryTreeNode **BT)//通过前序遍历的方式输入一个二叉树的每个节点,空节点用空格表示
{
	EType tem;
	
	scanf("%c",&tem);
	if(' ' == tem)
	{
	    *BT = NULL;
	}
	else
	{
		*BT = new BinaryTreeNode;
		(*BT)->data = tem;
		CreatBiTree(&(*BT)->LChild);//按照前序遍历,递归生成一个二叉树
        CreatBiTree(&(*BT)->RChild);
	}
}

void PreOrderNoRecursive(BinaryTreeNode *BT)
{
	Stack S;
	SType temp;
	BinaryTreeNode *p = BT;
	int MaxStackSize = 50;
	CreatStack(S,MaxStackSize);

	while(p || !IsEmpty(S))
	{
		if(p)
		{
			printf("%c\t",p->data);//访问"根"节点
			temp.ptr = p;
			Push(S,temp);//根节点指针进栈,以后回溯时再退栈
			p = p->LChild;
		}
		else
		{
			if(!IsEmpty(S))
			{
				Pop(S,temp);//从堆栈中弹出回溯节点指针,然后指向它的右子树
				p = temp.ptr;
				p = p->RChild;
			}
		}
	}
}

三、
效果展示

建立这样一棵二叉树

《数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)》

所以按照前序遍历输入应该是:“AB_D_ _CE_ _ _”(其中“_”代表空格)

那么运行结果为:

《数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)》

    原文作者:递归算法
    原文地址: https://blog.csdn.net/zhouzixin053/article/details/24120273
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞