非递归遍历实现思路:
 

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>typedef struct LINKNODE {struct LINKNODE* next;
}linknode;typedef struct LINKLIST {linknode head;int size;
}stack_list;#define MY_TRUE 1
#define MY_FALSE 0typedef struct BinaryNode {char ch;struct BinaryNode* lchild;struct BinaryNode* rchild;
}binarynode;typedef struct BITREESTACKNODE {linknode node;BinaryNode* root;int flag;
}bitreestacknode;stack_list* Init_stack_list()
{stack_list* stack = (stack_list*)malloc(sizeof(stack_list));stack->head.next = NULL;stack->size = 0;return stack;
}void Push_stack_list(stack_list* stack, linknode* data)
{if (stack == NULL) {return;}if (data == NULL) {return;}data->next = stack->head.next;stack->head.next = data;stack->size++;
}void Pop_stack_list(stack_list* stack)
{if (stack == NULL) {return;}if (stack->size == 0) {return;}linknode* pnext = stack->head.next;stack->head.next = pnext->next;stack->size--;
}linknode* Top_stack_list(stack_list* stack)
{if (stack == NULL) {return NULL;}if (stack->size == 0) {return NULL;}return stack->head.next;
}int Size_stack_list(stack_list* stack)
{if (stack == NULL) {return -1;}return stack->size;
}void Clear_stack_list(stack_list* stack)
{if (stack == NULL) {return;}stack->head.next = NULL;stack->size = 0;
}void Free_stack_list(stack_list* stack)
{if (stack == NULL) {return;}free(stack);
}//创建栈中的节点
BITREESTACKNODE* CreatBitreeStackNode(BinaryNode* node,int flag ) {BITREESTACKNODE* newnode = (BITREESTACKNODE*)malloc(sizeof(BITREESTACKNODE));newnode->root = node;newnode->flag = flag;return newnode;
}
//递归遍历void Recursion(BinaryNode* root) {if (root == NULL) {return;}printf("%c", root->ch);//打印左子树Recursion(root->lchild);//打印右子树Recursion(root->rchild);
}
//非递归遍历
void NonRecursion(BinaryNode* root) {stack_list* stack = Init_stack_list();Push_stack_list(stack, (linknode*)CreatBitreeStackNode(root, MY_FALSE));while (Size_stack_list(stack) > 0) {//弹出栈顶元素bitreestacknode* node = (bitreestacknode*)Top_stack_list(stack);Pop_stack_list(stack);//判断弹出节点是否为空if (node->root == NULL) {continue;}if (node->flag == MY_TRUE) {printf("%c", node->root->ch);}else {//当前节点的右节点入栈Push_stack_list(stack, (LINKNODE*)CreatBitreeStackNode(node->root->rchild, MY_FALSE));//当前节点的左节点入栈Push_stack_list(stack, (LINKNODE*)CreatBitreeStackNode(node->root->lchild, MY_FALSE));//当前节点的节点入栈node->flag = MY_TRUE;Push_stack_list(stack, (LINKNODE*)node);}}}void CreatBinaryTree() {binarynode node1 = { 'A',NULL,NULL };binarynode node2 = { 'B',NULL,NULL };binarynode node3 = { 'C',NULL,NULL };binarynode node4 = { 'D',NULL,NULL };binarynode node5 = { 'E',NULL,NULL };binarynode node6 = { 'F',NULL,NULL };binarynode node7 = { 'G',NULL,NULL };binarynode node8 = { 'H',NULL,NULL };//建立节点关系node1.lchild = &node2;node1.rchild = &node6;node2.rchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;printf("Recursion traverse:\n");//递归遍历Recursion(&node1);printf("\n");printf("Non_Recursion traverse:\n");//非递归遍历NonRecursion(&node1);printf("\n");
}int main()
{CreatBinaryTree();system("pause");return 0;
}

【C++】【十一】二叉树递归遍历与非递归遍历的实现及思路相关推荐

  1. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  2. 漫谈二叉树遍历(非递归)

    ------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...

  3. 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)

    一.递归法 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是"一看就会,一写就废". 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都 ...

  4. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  5. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  6. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  7. 二叉树先中后序递归遍历与非递归遍历、层次遍历

    文章目录 1 先序遍历 1.1 先序遍历递归 1.2 先序遍历非递归 2 中序遍历 2.1 中序遍历递归 2.2 中序遍历非递归 3 后序遍历 3.1 后序遍历递归 3.2 后序遍历非递归 4 层序遍 ...

  8. 实现二叉树的三种非递归遍历算法

    [问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...

  9. 二叉树的遍历(非递归)整理

    二叉树的遍历(非递归) 写在前面 二叉树重要,重要,重要.以下代码每日手撸一遍,深刻理解. 二叉树的先序遍历(非递归) 巧记心法 判断是否为空树 1.右侧入栈(访问,q指向右孩子,不空则入栈) 2.p ...

  10. 二叉树的后序非递归遍历(巧妙思想)

    大家都知道二叉树的前序非递归遍历非常好写: //二叉树的结构 public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode( ...

最新文章

  1. 设置VSCode刷新资源管理器快捷键Ctrl+Shift+R
  2. 10.2 运算符重载函数作为类成员函数和友元函数
  3. 【案例分析】分布式系统的接口幂等性设计!
  4. android:自己实现能播放网络视频url的播放器
  5. android点赞刷新列表图片闪烁,RecyclerView使用——有效解决刷新数据错乱,图片闪烁,OOM问题...
  6. s5pv210 linux内核移植,S5PV210(TQ210)学习笔记——内核移植与文件系统构建之二
  7. Cygwin中解决vi编辑器方向键和Backspace键不好使、安装vim的方法
  8. 记录——《C Primer Plus (第五版)》第十章编程练习第十题
  9. LAMP架构调优(九)——Apache Rewrite功能实战
  10. nusoap 与 CI框架不用WSDL
  11. 【Flask】通过Flask_login实现用户登录
  12. redis 菜鸟教程
  13. 遥感原理与应用总结——第二章:遥感平台及运行特点
  14. 典型的递归计算费氏数列
  15. 服务器重装Linux系统详细图文教程(centos7)
  16. 澳鹏Appen收购Quadrant:移动定位数据业务进一步增强
  17. JavaScript,for循环效率测试,不同遍历循环测试,数组添加效率测试,大数组拼接测试,for循环遍历修改 和 string replace效率
  18. Python读文件的三种方法对比
  19. Unity 入门教程:贪吃射(1) —— Unity 安装和项目创建
  20. java 二进制转换成十六进制字符串_将二进制字符串转换为十六进制字符串JAVA

热门文章

  1. matlab减,matlab-线性代数 矩阵的加、减、乘、除
  2. 如何提取明细表头_会计新手,如何开展做账工作?
  3. linux中断共享程序实现,如何在非实时linux上实现实时应用程序与内核模块之间共享存储器...
  4. 读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(1):Stream PCD流式载入激光点云数据
  5. phalcon php 5.4,如何在php上安装phalcon
  6. R6010-abort() has been called,Error openning file ../../modules/highgui/src/cap_ffmpeg_impl.hpp解决方法
  7. c++ 工作路径介绍及获取
  8. Learn OpenGL (五):向量
  9. 强哥原创管理方法论之“掌纹管理学”
  10. 【实现手机端上滑滚动加载列表】判断页面是否滚动到底部或者指定元素位置