二叉树中序遍历非递归算法实现详解
来源:互联网 发布:java中反射的概念 编辑:程序博客网 时间:2024/06/05 10:07
二叉树是数据结构中的经典结构,也是应用很广泛的结构之一。二叉树具有一些特定的性质,如 n0 = n2+1,在一些应用中,常常要求在树中查找具有某些特征的节点,或者对树中节点进行处理,即遍历二叉树的问题,其递归算法非常容易实现,非递归算法也有两种思路,本文将在程序中实现笔者认为容易识记的一种方法。
输入序列二叉树:
程序实现:
#include <iostream>#include <stack>using std::cin;using std::cout;using std::endl;using std::stack;// 定义二叉树结构, BiTree 为指针类型typedef struct BiTreeNode{int data;struct BiTreeNode *lchild,*rchild;}BiTreeNode,*BiTree;// &T 必须,可以试试去掉的后果 // 输入为先序序列的顺序,如图 输入序列为: 1 2 0 0 3 4 6 0 0 7 0 0 5 0 8 0 0// 0 - 表示 NULL,这里为了测试而设置的BiTree fn_CreateBiTree(BiTree &T){int data;cin>>data;if(data==0)T=NULL; // 遇到值为0的,将其置为NULL,表示为空else{if(!(T = (BiTree)new BiTreeNode))exit(0);T->data=data;fn_CreateBiTree(T->lchild);fn_CreateBiTree(T->rchild);}return(T);}// 先序遍历 递归实现void fn_PreOrderTraverse(BiTree T){if(T){if(T->data){cout<<T->data<<'\t';fn_PreOrderTraverse(T->lchild);fn_PreOrderTraverse(T->rchild);}return;}else return;}// 中序遍历 递归实现void fn_MidOrderTraverse(BiTree T){if(T){if(T->data){fn_MidOrderTraverse(T->lchild);cout<<T->data<<'\t';fn_MidOrderTraverse(T->rchild);}return;}else return;}// 中序遍历 非递归void InOrderTraverse(BiTree T){stack<BiTree> NodeStack; // 需要用到栈BiTree p; // 遍历的指针变量,类似于游标功能if(T) // 非空二叉树{p = T;while(p || !NodeStack.empty())// 若p不为空,或者栈非空,则进入循环{ // 初始p非空,栈为空if(p){NodeStack.push(p); // 将非空节点入栈,向左孩子遍历p=p->lchild;}else // 此时p为空,则p的父节点为栈顶指针,为分支最左的孩子,输出{p = NodeStack.top(); // 将p赋值为栈顶指针cout<<p->data<<'\t'; // 输出分支最左孩子NodeStack.pop(); // 删除栈顶指针p = p->rchild; // 将p赋值给其右孩子,继续遍历其右孩子分支}}}elsereturn;}void main(void){BiTree T;cout<<"输入二叉树序列,创建二叉树:"<<endl;T = fn_CreateBiTree(T);cout<<endl;cout<<"输出先序遍历-递归算法:"<<endl;fn_PreOrderTraverse(T);cout<<endl;cout<<"输出中序遍历-递归算法:"<<endl;fn_MidOrderTraverse(T);cout<<endl;cout<<"输出中序遍历-非递归算法:"<<endl;InOrderTraverse(T);cout<<endl;}
程序运行结果:
0 0
- 二叉树中序遍历非递归算法实现详解
- 二叉树中序遍历非递归算法详解
- 二叉树非递归遍历算法详解
- 二叉树非递归遍历算法详解
- 二叉树中序遍历非递归算法(C/C++语言实现)
- 二叉树中序遍历的非递归算法
- 二叉树中序遍历非递归算法.
- 二叉树中序遍历的非递归算法
- 二叉树中序遍历非递归算法
- 二叉树中序遍历的非递归算法
- 二叉树中序遍历非递归算法
- 二叉树中序遍历非递归算法
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 二叉树三种遍历算法递归和非递归实现
- 《算法导论》二叉树遍历的递归&非递归实现
- 二叉树遍历算法实现(递归、非递归)
- 算法:C++实现二叉树遍历(递归、非递归)
- android腾讯开放平台登陆授权,获取用户信息
- Android适配器之ArrayAdapter
- 15分钟学会使用Git和远程代码库
- java中常见异常
- VC开发常见错误之编程
- 二叉树中序遍历非递归算法实现详解
- 如何更改Android的默认虚拟机地址
- python随笔1(5.22)
- PE结构详解图( 超详细,很清晰的2张图 )
- 黑马程序员_面向对象(三)_异常
- windows平台c++开发"How to"总结
- 母牛的故事
- c语言指针,数组
- 黑马程序员——面向对象1