二叉树是数据结构中的经典结构,也是应用很广泛的结构之一。二叉树具有一些特定的性质,如 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;
}

程序运行结果:

二叉树中序遍历非递归算法实现详解相关推荐

  1. 二叉树后序遍历非递归算法(详解)

    前序和中序都比较简单 后序我按自己的理解好好说一下吧,基本思路是利用堆栈将递归转化为循环 首先定义节点结构 struct BTNode {int val;bool visR;bool visL;BTN ...

  2. C++实现二叉树中序遍历非递归算法

    /*二叉树的中序遍历非递归算法目标遍历的二叉树:1/ \2 4/ \3 5 待输出结果为3,2,5,1,41.首先得用上面定义的结构体把这颗树表示出来2.表示出这颗树后在调用二叉树的中序遍历非递归算法 ...

  3. 二叉树中序遍历非递归Java

    问题来源与描述 问题来源:LeetCode 94,二叉树的中序遍历 思路 二叉树的中序遍历顺序是左,根,右. 使用递归比较简单: class Solution {public List<Inte ...

  4. 数据结构二叉树后序遍历非递归算法

    后序遍历的非递归代码 void PostOrder(BiTree T) { // Add your code hereif(T==NULL) return; //如果为空,则退出Stack s;Ini ...

  5. 二叉树(中序遍历)非递归

    为什么80%的码农都做不了架构师?>>>    #include <iostream> #include <stack> /* run this progra ...

  6. 数据结构二叉树中序遍历递归和非递归算法

    2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...

  7. 【C语言】二叉树中序遍历(递归和非递归)算法

    二叉树中序遍历的实现思想是: 访问当前节点的左子树: 访问根节点: 访问当前节点的右子树: 图 1 二叉树 以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1: ...

  8. C++算法二叉树中序遍历

    非递归中序遍历二叉树思路(借助栈实现): 1.依次将所有左子节点压栈,直至为空: 2.弹出栈顶元素,访问栈顶,将栈顶的右子节点压栈,返回步骤1: 3.直至栈空. (**递归的本质也是通过函数栈来实现代 ...

  9. 二叉树的后序遍历(非递归算法)

    /*     后序遍历(非递归算法)     ①先序遍历顺序:根节点-左孩子-右孩子     ②后序遍历顺序:左孩子-右孩子-根节点     ③后序遍历倒过来:根节点-右孩子-左孩子     ①和③对 ...

最新文章

  1. 2019年上半年收集到的人工智能循环神经网络干货文章
  2. TCP/IP详解--学习笔记(6)-UDP协议
  3. 砂.随笔.三十四.用时间在等待
  4. vim 与系统剪切板
  5. mysql排行榜sql的实现
  6. 爱的世界很拥挤,写在读《爱,就这么简单》之后
  7. 一个用于 Angular 开发的 Chrome 扩展 - Angular Dev Tools
  8. 【看动漫学编程】程序员在异世界生个娃 第2篇:外挂已准备就绪
  9. c++ 1:非MFC工程使用MFC库时的问题及解决办法(如果要用CString或者提示windows头文件重复包含)...
  10. PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
  11. [HAOI2009]毛毛虫(树的直径)
  12. canvas 生成图片模糊
  13. GoodUP:智协云店通+BitCOO的4WiN全球互贸链 | 翼次元空间
  14. 深度学习和神经网络介绍
  15. web项目上云_披荆斩棘向云端 — 职能业务上云踩坑实战
  16. 解决浏览器下载速度慢的问题
  17. 来鑫干货解读:迅雷链到底有什么了不起?
  18. 比尔·盖茨买百万亩农地成美“头号地主”,图扑数字孪生农场
  19. (OK) 编译 cm-13-kiwi for (华为 荣耀 5X) - 成功
  20. java 读取excel表格_Java读取excel表格(原理+实现)

热门文章

  1. windows 安装metis_图划分软件Metis的使用(win10+vs2017)
  2. 嵌入式-ARM-学习总结(7):按键与中断
  3. android7.1 jack-admin 报错
  4. 【码农学编曲】关于宿主软件和插件的推荐
  5. Linux下配置网卡信息
  6. LM38简易方波发生器
  7. canal1.1.5 配置kaka
  8. ISIS如何选举DIS的,DIS的具体作用,和OSPF的DR有什么相同和不同点。举例说明
  9. 入行多年软件测试总结的经验
  10. 快速拆分excel表格-python