二叉树非递归先序遍历

二叉树的递归先序遍历很简单,假设二叉树的结点定义如下:

1 struct BinaryTreeNode
2 {
3     int m_nValue;
4     BinaryTreeNode*  m_pLeft;
5     BinaryTreeNode*  m_pRight;
6 };

递归先序遵循:根-左-右的顺序

1 void PreOrder(BinaryTreeNode* Root)
2 {
3     if(Root==NULL)
4         return;
5     
6     cout<<Root->m_nValue<<endl;
7     PreOrder(Root->m_pLeft);
8     PreOrder(Root->m_pRight);    
9 }

 

非递归我们以一个例子说明,仍然以之前博文的一个二叉树说明:

1                 8
2                /  \
3               6   10
4              / \  / \
5             5  7  9 11

 

非递归步骤:

1.我们先定义一个栈S,栈的每个元素为二叉树节点类型结点

 

2.首先将根节点压入S中,输出根节点,同时弹出栈顶节点 (输出8)

 

3.由于非递归的实质仍然是先根再左后右的顺序,然而对于根结点的左右子节点来说要先访问左节点那么必须先把右先节点压栈

 

4.现在S中从栈顶到栈底有6,10,现在以输出并弹出栈顶元素(输出8,6)

 

5.继续将节点6的左右子节点加入到栈S中,从栈顶到栈底有5,7,10

 

6.输出并弹出栈顶元素,由于此时节点5没有子结点则一种弹出直到有子结点的节点10,则从栈顶到(输出8,6,5,7)此时栈顶到栈顶10

 

7 弹出并输出栈顶节点元素10,此时将其左右子节点入栈S,此时栈顶到栈底9,11(输出8,6,5,7,10)

 

8.由于节点9和11都没有子节点则一直弹出并输出(输出8、6、5、7、10、9、11)

 

 

 

代码实现如下:
(函数PreOrder为递归先序遍历函数,PreOrderNew为非递归先序遍历函数)

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 
 5 struct BinaryTreeNode
 6 {
 7     int m_nValue;
 8     BinaryTreeNode*  m_pLeft;
 9     BinaryTreeNode*  m_pRight;
10 };
11 
12 
13 void CreateTree(BinaryTreeNode** Root)
14 {
15     int data;
16     cin>>data;
17     if(data==0)
18     {
19         *Root=NULL;
20         return;
21     }
22     else
23     {
24         *Root=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
25         (*Root)->m_nValue=data;
26         CreateTree(&((*Root)->m_pLeft));    
27         CreateTree(&((*Root)->m_pRight));
28     }
29 }
30 
31 
32 void PreOrder(BinaryTreeNode* Root)
33 {
34     if(Root==NULL)
35         return;
36     
37     cout<<Root->m_nValue<<endl;
38     PreOrder(Root->m_pLeft);
39     PreOrder(Root->m_pRight);    
40 }
41 
42 void PreOrderNew(BinaryTreeNode* Root)
43 {
44     if(Root==NULL)
45         return;
46     
47     stack<BinaryTreeNode*> S;
48 
49     S.push(Root);
50 
51     while(!S.empty())
52     {
53         BinaryTreeNode* Temp=S.top();
54         S.pop();
55         cout<<Temp->m_nValue<<",";
56 
57         if(Temp->m_pRight!=NULL)
58         {
59             S.push(Temp->m_pRight);
60         }
61 
62         if(Temp->m_pLeft!=NULL)
63         {
64             S.push(Temp->m_pLeft);
65         }
66     }
67     
68 }
69 
70 int main()
71 {
72     BinaryTreeNode* root;
73     cout<<"Please input the tree node data(0-exit):\n";
74     CreateTree(&root);
75     cout<<"The PreOrder of Binary Tree:\n";
76     PreOrder(root);
77     cout<<endl;
78     cout<<"The PreOrder New of Binary Tree:\n";
79     PreOrderNew(root);
80     cout<<endl;
81     return 0;
82 }

运行结果:

 

转载于:https://www.cnblogs.com/vpoet/p/4681420.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象与基于对象 区别

很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;却一不可。通常“基于对象”是使用对象&#xff0c;但是无法利用现有的对象模板产生新的对象类型&#xff0c;继而产生新的对象&…

Flex与Javascript交互

关键字&#xff1a;ExternalInterface 所用类库&#xff1a;SWFObject /** * Flex调用Javascript函数 * params functionName:String Javascript函数名称 * params ...params Javascript函数参数 * return 返回Javascript函数的return内容 **/ ExternalInterface.call(…

显示器调校与Soft Proofing ZZ

版权归原作者所有&#xff01; http://www.cgan.net/science/popular/cookie/displayregulate.htm 自从桌面出版走到计算机上&#xff0c;显示器成为印前流程中重要的设备之一。从扫描、数码摄影、相片修改、排版等工序中&#xff0c;也可找到显示器的存在。但往往很多同业却忽…

SparkContext: Error initializing SparkContext解决方法

SparkContext: Error initializing SparkContext解决方法Spark在配置高可用集群中&#xff0c;出现报错 ERROR SparkContext: Error initializing SparkContext. java.net.ConnectException: Call From hadoop102/192.168.10.102 to hadoop102:8020 failed on connection excep…

tomcat 绑定 ip 及域名,限制非法域名访问

公司WEB 采用linuxtomcat架构。经常会收到电信的警告&#xff0c;说某个IP下挂用了未备案域名&#xff0c;如果不处理就封IP。鉴于此&#xff0c;需要将tomcat的访问地址进行限制&#xff0c;只允许通过IP地址或者自己指定的域名来访问。配置tomcat/conf/server.xml 文件&#…

数据库设计(四)概念数据模型

目标&#xff1a;本文主要介绍如何定义实体的主、次标识符。一、标识符标识符是实体中一个或多个属性的集合&#xff0c;可用来唯一标识实体中的一个实例。要强调的是&#xff0c;CDM中的标识符等价于PDM中的主键或候选键。每个实体都必须至少有一个标识符。如果实体只有一个标…

error C2471和error C1083

error C2471和error C1083 VS2008IDE&#xff1a;编译时出现问题&#xff1a;error C2471: 无法更新程序数据库“d:\my documents\visual studio 2008\projects\mdib\mdib\debug\vc90.pdb”error C1083: 无法打开程序数据库文件:“d:\my documents\visual studio 2008\projects…

中文/英文换行总结

html部分 <div class"parent"><p class"p1">湿哒哒大的大大大的大的大大大的大的啊啊大大大啊大大打啊打大大大</p><p class"p2">湿哒哒大的大大大的大的大大大的大的啊啊大大大啊大大打啊打大大大</p><p clas…

Go学习笔记—基于Go的进程间通信

IPC&#xff08;Inter-Process Communication 进程间通信&#xff09; 一般方法&#xff1a;(1) 半双工Unix管道 (2) FIFOs(命名管道) (3) 消息队列 (4) 信号量 (5) 共享内存 (6) 网络Socket (7) RPC(远程过程调用) &#xff08;一&#xff09;管道&#xff08;Pipe&#xff…

rsync+lsyncd实现(本地以及远程)文件实时同步

lsyncd基于lua语言开发&#xff0c;整合了rsync和notify 实现文件的实时同步 系统环境cat /etc/issue CentOS release 6.6 (Final)uname -sr Linux 2.6.32-504.el6.x86_64 服务器规划 rsync服务器&#xff1a; 192.168.10.241 rsync lsyncd服务器 &#xff…

萨蒂扬软件技术(南京)研发中心”落户高新区

萨蒂扬软件技术&#xff08;南京&#xff09;研发中心”落户高新区 2007-02-12“中国软件名城”成为南京吸引世界软件巨头强磁场“萨蒂扬软件技术&#xff08;南京&#xff09;研发中心”落户高新区 世界知名的印度软件企业巨头萨帝扬计算机服务有限公司挥师江苏亮出精彩第一笔…

JavaScript常用正则表达式收集

JavaScript常用正则表达式收集 ---------------------------------------------------------------------------------------- 正则的用法参见&#xff1a;http://blog.csdn.net/xxj_jing/article/details/6977078 下面是个简单判断 1.匹配中文字符 2.匹配特殊字符(符合 wind…

Go学习笔记—多线程

多线程编程 ​ 一个进程可以包含多个线程&#xff0c;这些线程运行的一定是同一个程序&#xff08;进程程序&#xff09;&#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位&#xff0c;线程是调度运行的基本单位&#xff0c;线…

maven必知必会

目录 了解mavenmaven的作用maven仓库本地配置添加远程仓库依赖搜索顺序定制包到本地仓库pom文件依赖管理原则构建声明周期插件了解maven maven的作用 maven采取约定大于配置的原则,规范了一套标准的javaweb项目结构maven提供了完备的包管理功能,不用到处找jar包了maven提供了一…

lecture 4 : More Objective-C

Creating Objects 这件事困扰我一点时间了&#xff0c;ObjC没有一个Constructor的概念 而在Create Objects这件事上既有用过自己写的-init&#xff0c;还return instancetype&#xff0c;大概这个&#xff0c;也有用过一些Class Method&#xff0c;就是明确知道是id类型的&…

对象实体 参考标准

1usingSystem;2usingSystem.Data;34namespaceFramework.Components5{ 6 /**//// <summary> 7 /// 公告通知实体 8 /// </summary> 9 public class NoticeInfo 10 { 11 基础信息-------------------------------------------------------…

SerialPort comstat is being used without defining

Run-Time Check Failure #3 - The variable comstat is being used without being initialized. 参考&#xff1a;http://blog.sina.com.cn/s/blog_5d2412000100ojx3.html 方案1: 改变项目配置属性 一种解决方案是改变基本运行时检查&#xff08;changing the runtime checks i…

Leetcode:27. 移除元素

力扣题目链接 解题思路 首先很容易想到暴力解法,用两个for循环,第一个for循环用来遍历整个数组,第二个for循环用来更新数组.但这种解法的时间复杂度为O(n^2) 因此考虑双指针思想,通过一个快指针和慢指针在一个for循环下完成两个for循环的任务,其中,快指针用来寻找新的元素,即…

【原】简单shell练习(四)

1.查看已开启端口信息 #ss -ln 2.列出谁在使用某个端口&#xff08;如&#xff1a;80&#xff09; #lsof -i:80 3.显示文件夹下文件信息 #find /home/root -type f#find -type f 4.磁盘大小信息 #df -h #du -sh * 5.查看一个文件夹下文件总个数 # ls -l |wc -l 6.查看进程是否…

JavaScriptWindow使用对象

窗口对象的属性和方法&#xff1a;格式&#xff1a;[window.]属性[window.]方法&#xff08;参数&#xff09;opener.属性opener.方法&#xff08;参数&#xff09;self.属性self.方法&#xff08;参数&#xff09;parent.属性parent.方法&#xff08;参数&#xff09;top.属性…