数据结构-----中序遍历二叉树非递归算法(利用堆栈实现)
来源:互联网 发布:淘宝会查快递的重量吗 编辑:程序博客网 时间:2024/06/06 10:04
一、非递归中序遍历算法思想
(1)首先节点指针(一个"根"的指针)进栈,然后将节点指针指向进栈节点的左子树的根,重复(1),直到指针指向空(最后一个进栈的是最左子树),转(2);
(2)堆栈非空时,从堆栈中退出一个节点的指针,访问该节点,转(3),堆栈为空时,结束算法;
(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 InOrderNoRecursive(BinaryTreeNode *BT);//跟前序遍历就是这点不同int main(){ BinaryTreeNode *BT = NULL;CreatBiTree(&BT);//按照前序遍历输入方式构造一棵二叉树printf("中序遍历二叉树非递归算法输出为:");InOrderNoRecursive(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){if(IsEmpty(S))return false;result = S.element[S.top];S.top--;return true;}bool Push(Stack &S,SType &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 InOrderNoRecursive(BinaryTreeNode *BT){Stack S;SType temp;BinaryTreeNode *p = BT;int MaxStackSize = 50;CreatStack(S,MaxStackSize);while(p || !IsEmpty(S)){if(p){temp.ptr = p;Push(S,temp);p = p->LChild;}else{if(!IsEmpty(S)){Pop(S,temp);p = temp.ptr;printf("%c\t",p->data);//跟前序遍历不同就是访问节点的时机不同p = p->RChild;}}}}三、效果展示
建立这样一颗二叉树
所以按照前序遍历输入应该是:“AB_D_ _CE_ _ _”(其中“_”代表空格)
那么运行结果为:
0 0
- 数据结构-----中序遍历二叉树非递归算法(利用堆栈实现)
- 数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)
- 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)
- 二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)
- 数据结构-----二叉树的中序遍历的非递归算法实现
- 数据结构----二叉树遍历的非递归算法实现
- 利用java实现二叉树以及非递归遍历算法
- 【数据结构】二叉树(前、中、后)序遍历的递归与非递归算法
- 数据结构--二叉树遍历非递归实现
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 【LintCode-67】二叉树的中序遍历(Java实现-递归算法/非递归算法)
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- 数据结构-非递归实现后序遍历二叉树
- 数据结构之 非递归中序遍历二叉树
- 数据结构六:二叉树的先序建树与中序的非递归遍历算法
- 【二叉树遍历算法】——前/中/后序递归与非递归的实现
- 利用栈的中序遍历二叉树的非递归算法
- 【数据结构与算法】二叉树递归与非递归遍历
- UVa 11520 - Fill the Square
- 移动游戏开打平台争夺战
- 长按电源键,为Android手机添加自动重启Item
- 一周热点:微软SQL Server 2014三大新特性
- 定义明确的安全需求
- 数据结构-----中序遍历二叉树非递归算法(利用堆栈实现)
- 2-3树的java实现
- 30岁之前如何投资自己?
- 转:C++深入浅出之正则表达式(二)
- 剖析Intent、Broadcast和Adapter
- spring mvc4使用及json 日期转换解决方案
- Android横竖屏切换不销毁当前Activity的方法
- 字符
- Linux/ubuntu下core文件的产生与使用