数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)
来源:互联网 发布: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
- 数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)
- 数据结构-----中序遍历二叉树非递归算法(利用堆栈实现)
- 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)
- 【数据结构】二叉树(前、中、后)序遍历的递归与非递归算法
- 【LintCode-66】二叉树的前序遍历(Java实现-递归算法/非递归算法)
- [算法]二叉树的非递归前序遍历算法
- 算法习题43:递归和非递归实现二叉树的前序遍历
- 【二叉树遍历算法】——前/中/后序递归与非递归的实现
- 数据结构----二叉树遍历的非递归算法实现
- 数据结构 — 实现二叉树的前序,中序,后序遍历(非递归)
- 利用java实现二叉树以及非递归遍历算法
- 经典算法之非递归算法实现二叉树前、中、后序遍历
- 二叉树的前序遍历---非递归实现
- 二叉树非递归前、中、后序遍历实现
- 数据结构--二叉树遍历非递归实现
- 用java实现二叉树非递归的前序,中序,后序遍历算法
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 链式二叉树的前序创建、递归前序遍历、非递归堆栈前序遍历、前序销毁以及求二叉树的深度
- Jquery和ajax开发案例之---动态股票信息
- 正在求知路上的毛毛虫希望能遇见智者帮忙化蝶奥
- 一款好用的PDF转换成Word转换器
- Android系统源码学习步骤
- gets()函数详解和缺陷
- 数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)
- 苹果无敌风火轮如果不是那么酷的
- Java4Android (第28~29集) 接口
- 我的思想之旅
- 大数阶乘
- Android - monkey 参数说明
- 不能任意改变它的大小
- 2014-04-19编程之美初赛题目及答案解析
- mysql事务,锁,sql注入,sql_mode学习日记