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

来源:互联网 发布:mac爱奇艺视频转换器 编辑:程序博客网 时间:2024/06/16 08:20

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

       (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_ _ _”(其中“_”代表空格)

那么运行结果为:


0 0