【C++】【十一】二叉树递归遍历与非递归遍历的实现及思路
非递归遍历实现思路:
#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;
}
相关文章:

定时调度模块:sched
定时调度模块:sched """A generally useful event scheduler class. 事件调度器类Each instance of this class manages its own queue. 类的每一个实例独立管理自己的队列 No multi-threading is implied; you are supposed to hack that yourself, or use a s…

Mat转换为IplImage 类型和CvMat 类型
cv::Mat img; CvMat cvMatImg img; IplImage IplImg img;转载:http://blog.csdn.net/zhuwei1988

大数据学习思路
学习大数据已经有一段时间了,抽空回顾一下自己学习的一些内容。下图主要为自己学习大数据的一个过程。 阶段一:Java基础 掌握JAVA基本语法、面向对象、集合、IO流、多线程、网络编程 阶段二:MySQL CRUD 阶段三…

【C++】【十二】排序实现及思路
掌握核心知识点: 1.插入排序在一下2种情况效率较高:1)数据基本有序 2)数据序列较少 希尔排序是在插入排序的基础上的改进。 2.快速排序 3.归并排序 4.堆排序:数据初始化为数据,根据完全二叉树&#…

Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...
2019独角兽企业重金招聘Python工程师标准>>> 1、如果安装了FTP,可以使用FTP上传rpm到服务器进行安装; 2、挂载光驱cdrom到mnt文件夹下,进入package文件夹rpm进行安装; 3、有源码包进行源码安装; 4、自求多福…

IplImage 类型和 CvMat 类型转换为 Mat 类型
IplImage *IplImg cvLoadImage("fruits.jpg"); Mat img(IplImg, true);转载:http://blog.csdn.net/zhuwei1988

麦当劳数字化转型中获得的6个数据科学经验
摘要 美国大数据公司Civis Analytics于2017年底与麦当劳北美市场营销和数据科学团队建立了数据技术合作伙伴关系,经过一年半的努力,近期在纽约广告周上共同展示了一些重要的学习成果。 麦当劳客户数据科学总监David Galinsky和麦当劳媒体科学经理Emma Hi…

操作系统(三)
学习记录(3) 线程 1.线程的优势在哪? 1.1 多线程之间会共享同一块地址空间和所有可用数据的能力,这是进程所不具备的。 1.2 线程要比进程更轻量级,由于线程更轻,所以它比进程更容易创建,也更容…

【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
近期公司的flannel网络很不稳定,花时间研究了下并且保证云端自动部署的网络能够正常work。 1.网络拓扑 拓扑如下:(点开看大图) 容器网卡通过docker0桥接到flannel0网卡,而每个host对应的flannel0网段为 10.1.x.[1-255…

图像读取、转为灰度图像、均值平滑、显示保存操作
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> int main( ) {// 读取图像源cv::Mat srcImage cv::imread("..\\images\\pool.jpg");if( srcImage…

python 查询 elasticsearch 常用方法(Query DSL)
2019独角兽企业重金招聘Python工程师标准>>> 1. 建立连接 from elasticsearch import Elasticsearch es Elasticsearch(["localhost:9200"])2. 查询所有数据 # 方式1: es.search(index"index_name", doc_type"type_name"…

OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort
目录 0.极限约束,对极校正 1.摄像机成像原理简述 2.成像畸变 2.1. 畸变数学模型 2.2. 公式推导 3.畸变校正 3.1. 理论推导 4. 图像去畸变** 5. 图像尺度缩放与内参的关系** 5.1 undistortPoints() 5.2 initUndistortRectifyMap() 5.3 undistort() 6.Un…

Ubuntu14.04 Mininet中将Openvswitch升级步骤
2019独角兽企业重金招聘Python工程师标准>>> 首先下载Mininet apt-get install mininetservice openvswitch-controller stopupdate-rc.d openvswitch-controller disablemn --test pingall 这里可能会出现以下错误sudo mn --mac --controllerremote,port6653 --top…

(转)软件测试的分类软件测试生命周期
软件测试的分类&软件测试生命周期 软件测试的分类: 按测试执行阶段:单元测试、集成测试、系统测试、验收测试、(正式验收测试,Alpha 测试-内侧,Beta 测试-公测) 按测试技术分类:黑盒测试、白…

OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时
目录 OpenCV如何扫描图像、利用查找表和计时 1.函数计算时间测试case 2. Mat图像的存储机理 3. 像素遍历的3--4种方式 4. 实例 OpenCV如何扫描图像、利用查找表和计时 如何计算函数运行时间? Mat图像如何存储? 如何高效遍历图像像素? …

Java String.split()用法小结
2019独角兽企业重金招聘Python工程师标准>>> 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用Strin…

217. 验证码 demo
2019独角兽企业重金招聘Python工程师标准>>> 1.效果 2.准备: 下载相关的jar 这里我使用的是ValidateCode 这个jar https://my.oschina.net/springMVCAndspring/blog/1815719 (1)相关jar下载路径 链接:https://pan.…

OpenCV 【十三】矩阵的掩码操作
目录 1 Mask掩膜/滤波核 1.1 原理 1.2 实例 1.3 结果对比 2. filter2D函数 2.1 原理 2.2 实例 2.3 结果 1 Mask掩膜/滤波核 1.1 原理 矩阵的掩码操作很简单。其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值。掩码矩阵中…

【ArrayList】为什么java.util.concurrent 包里没有并发的ArrayList实现?
2019独角兽企业重金招聘Python工程师标准>>> 为什么java.util.concurrent 包里没有并发的ArrayList实现? 问:JDK 5在java.util.concurrent里引入了ConcurrentHashMap,在需要支持高并发的场景,我们可以使用它代替HashMa…

Android实现买卖商品小游戏
之前为了学习GreenDao,写的练手项目,欢迎指点 仿手游《混》《买房记》,单机游戏,无需联网 1、主界面 2、游戏界面 可以选择地区出发随机事件,进行贷款/还款,治疗,还债,买卖商品&…

OpenCV 【十四】改变图像的对比度和亮度高度关联章节:OpenCV 【十】——Gamma校正 ——图像灰度变化
目录 0 提问 1.1 原理 trick: 1.2 代码 1.3 结果 0 提问 访问像素值 用0初始化矩阵 saturate_cast 是做什么用的,以及它为什么有用 1.1 原理 图像处理 一般来说,图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像的函数。 图像变换可分…

getRotationMatrix2D 函数
cv::Mat cv::getRotationMatrix2D( Point2f center, double angle, double scale ) {// 角度转换angle * CV_PI/180;// 计算旋转矩阵角度double alpha cos(angle)*scale;double beta sin(angle)*scale;Mat M(2, 3, CV_64F);double* m (double*)M.data;// 构建旋转矩阵m[0] …

java学习笔记-java中运算符号的优先顺序
java中各种运算符具有优先级顺序,一般会先计算优先级高的,再计算优先级低的。可以使用()使得优先级变为最高。在算术运算中,优先级为 --* / -在在逻辑运算中的优先级是 ! 取反&& || & |在位运算中的优先级 ÿ…

红帽发布第四季度和2019财年报告,多项指标维持两位数增速
近日,红帽公司发布了其第四季度和2019财年报告。这是在被 IBM以340亿美元的价格收购 后,红帽公布的第一份财报,数据颇为亮眼。 报告显示,红帽公司第四季度总收入8.79亿美元,同比增长14%;整个财年营收34亿美…

OpenCV 【十五】绘直线/椭圆/矩形/圆及其填充
目录 1. 概况 2. 原理 2.1 Point 2.2 Scalar 3. 代码 4.结果 1. 概况 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用OpenCV的函数 rectangle 绘 矩形 用OpenCV的函数 circle 绘 圆 用Op…

spring-boot Junit4单元测试
2019独角兽企业重金招聘Python工程师标准>>> 如果是使用spring-boot 1.4以下的版本 RunWith(SpringJUnit4ClassRunner.class) SpringApplicationConfiguration(classes 启动类.class) public class ApplicationTest {//代码省略 } 使用SpringApplicationConfigurat…

VideoCapture 读取视频文件,显示视频(帧)信息
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() {// 定义相关VideoCapture对象VideoCapture capture;…

Go 1.12发布:改进了运行时性能以及模块支持
Go最新版本1.12于近日发布,该版本并没有改动语法规范,它主要对运行时性能、编译工具链以及模块系统等进行了优化。另外,它还为TLS 1.3提供了opt-in支持,同时改进了对MacOS和iOS等系统的支持。 Go 1.12最大的更新亮点是改进了Go运行…

OpenCV 【十六】RNG随机数发生器putText绘制文字
1 目的 使用 随机数发生器类 (RNG) 并得到均匀分布的随机数。 通过使用函数 putText 显示文字。 第一步是实例化一个 Random Number Generator(随机数发生器对象) (RNG): RNG rng( 0xFFFFFFFF ); 初始化一个 0 矩阵(代表一个全黑的图像), 并且指定它…

分享一段Java搞笑的代码注释
原文:http://www.cnblogs.com/xdp-gacl/p/4198935.html // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // …