树的非递归中序和层次遍历实现

Similar documents
PowerPoint Presentation

Guava学习之Resources

通过Hive将数据写入到ElasticSearch

使用Cassandra和Spark 2.0实现Rest API服务

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

第3章.doc

Guava学习之CharSequenceReader

Apache CarbonData集群模式使用指南

untitled

韶关:神奇丹霞

Hive:用Java代码通过JDBC连接Hiveserver

哼, 你 們 不 回 答 又 怎 麼 樣? 不 管 是 多 大 來 頭, 現 在 都 被 血 魔 吞 噬 無 蹤 了 你 們 幾 個 真 是 太 過 分, 我 不 犯 你 們, 你 們 卻 一 天 到 晚 來 挑 釁 我 教 尊 冷 笑 著 說 道 嗚, 大 人 土 地 大 姐 跪 下 來, 流 下

Flume-ng与Mysql整合开发

使用MapReduce读取XML文件

Hadoop&Spark解决二次排序问题(Hadoop篇)

伊春:醉人林都

Spark读取Hbase中的数据

PowerPoint 演示文稿

C 1

在Spring中使用Kafka:Producer篇

使用Hive读取ElasticSearch中的数据

关林:武圣陵寝

泰山:五岳独尊

FY.DOC

Hadoop元数据合并异常及解决方法

ebook39-5

国内26省市新能源汽车推广规划已出台

北戴河:海阔天空

新版 明解C++入門編

報名簡章核定版.doc

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民


西岭雪山滑雪场

三种方法实现Hadoop(MapReduce)全局排序(1)

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

untitled

untitled

Zookeeper使用ACL进行访问权限控制

使用Spark SQL读取Hive上的数据

NethersoleJO89(8).indd

试卷代号 : 座位号 I II 中央广播电视大学 学年度第二学期 " 开放本科 " 期末考试 数据结构试题 2011 年 7 月! 题号 I - I 二 三 四! 五! 六 总分 分数 I I I 1 1- I ---1 I 得分 评卷人 一 单项选择


新・明解C言語入門編『索引』

Flink快速上手(QuickStart)

江门:中国第一侨乡

6 tree

是 喔, 就 是 那 個 在 BBS 醫 療 版 跟 你 嗆 聲, 自 稱 有 三 十 多 年 推 拿 經 驗 的 大 叔 嗎? 一 個 看 來 頗 為 清 秀 的 女 生 問 道, 她 語 氣 中 略 感 訝 異 是 啊, 什 麼 推 拿 按 摩 有 多 好, 還 要 人 生 病 盡 量 不 要

迅速在两个含有大量数据的文件中寻找相同的数据

如何在 Apache Hive 中解析 Json 数组

教育扩张能改善收入分配差距吗?——来自CHNS2006年数据的证据

山水文化,市井人家——以湖州邱城小镇的概念性规划为例

幻灯片 1

运用伸展树解决数列维护问题

柳州化工股份有限公司

NA - 5 自动焊接系统使用说明书 doc

在Fedora上部署Hadoop2.2.0伪分布式平台

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

第一章 前言

Ubuntu和CentOS如何配置SSH使得无密码登陆


新・解きながら学ぶJava

1

市 立 永 平 高 中 無 填 報 無 填 報 (02) 市 立 樹 林 高 中 已 填 報 已 填 報 (02) 市 立 明 德 高 中 已 填 報 (02) 市 立 秀 峰 高 中 已 填 報

2. 禁 止 母 乳 代 用 品 之 促 銷 活 動, 以 及 不 得 以 贊 助 試 用 或 免 費 等 方 式, 取 得 奶 瓶 及 安 撫 奶 嘴 認 證 說 明 以 贊 助 試 用 或 免 費 等 方 式, 取 得 奶 瓶 及 安 撫 奶 嘴, 並 在 婦 產 科 門 診 兒 科 門 診 產

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

1.5招募说明书(草案)

Kafka客户端是如何找到 leader 分区的

昆明:茶暖花瘦

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

untitled

新・解きながら学ぶC言語

ebook39-6

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

新版 明解C言語入門編

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

C/C++ - 文件IO

商 业 城 大 华 标 准 70 万 70 万 驰 宏 锌 锗 瑞 华 标 准 140 万 150 万 亚 星 锚 链 江 苏 公 证 天 业 标 准 80 万 80

欢迎辞

金 陵 饭 店 中 兴 华 已 报 备 按 照 国 资 委 要 求 定 期 轮 换 天 衡 已 报 备 按 照 国 资 委 要 求 定 期 轮 换 *ST 中 富 中 喜 已 报 备 业 务 约 定 书 到 期 普

辉 丰 股 份 重 大 事 项, 特 停 南 方 轴 承 临 时 停 牌 德 力 股 份 临 时 停 牌 瑞 丰 光 电 临 时 停 牌 联 建 光 电 临 时 停 牌 卡 奴 迪 路 临 时 停 牌

日 涨 幅 偏 离 值 达 到 7% 的 前 五 只 证 券 : 温 氏 股 份 ( 代 码 ) 涨 幅 偏 离 值 :11.68% 成 交 量 :1752 万 股 成 交 金 额 : 万 元 机 构 专 用 机 构 专 用

东 华 能 源 江 苏 苏 亚 金 诚 已 报 备 因 地 域 及 审 计 时 间 安 排 等 原 因 中 兴 华 已 报 备 客 户 重 新 选 聘 会 计 师 事 务 所 亿 帆 鑫 富 立 信 已 报 备 客

昆 明 机 床 瑞 华 已 报 备 前 任 服 务 年 限 较 长 毕 马 威 华 振 已 报 备 未 与 客 户 未 就 2015 年 审 计 收 费 达 成 一 致 意 见 中 国 核 电 天 健 已 报 备 定

光 一 科 技 重 大 事 项, 特 停 茂 业 商 业 重 要 事 项 未 公 告, 连 续 停 牌 浙 富 控 股 重 大 事 项, 特 停 键 桥 通 讯 重 大 事 项, 特 停 黑 牛 食 品 重 大 事 项, 特 停

郑 州 煤 电 重 要 事 项 未 公 告, 连 续 停 牌 金 圆 股 份 重 大 事 项, 特 停 永 鼎 股 份 重 要 事 项 未 公 告, 连 续 停 牌 长 城 影 视 临 时 停 牌 天 兴 仪 表 临 时 停 牌

卧 龙 地 产 重 要 事 项 未 公 告, 连 续 停 牌 春 兴 精 工 临 时 停 牌 *ST 沧 大 重 要 事 项 未 公 告, 连 续 停 牌 天 地 源 重 要 事 项 未 公 告, 连 续 停 牌 汇 冠 股 份

金 圆 股 份 重 大 事 项, 特 停 长 城 影 视 临 时 停 牌 天 兴 仪 表 临 时 停 牌 商 赢 环 球 重 要 事 项 未 公 告, 连 续 停 牌 荣 安 地 产 临 时 停 牌 中 南 文 化

Untitled Document

上市公司股东大会投票信息公告( )

股票代码: 股票简称:*ST新梅 编号:临

金 利 科 技 临 时 停 牌 凤 凰 光 学 重 要 事 项 未 公 告, 连 续 停 牌 安 源 煤 业 重 要 事 项 未 公 告, 连 续 停 牌 万 泽 股 份 临 时 停 牌 爱 康 科 技 重 大 事 项, 特 停

证券代码:000776   股票简称:延边公路   编号:2003-00

Apache Spark 2.4 新增内置函数和高阶函数使用介绍

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

行 业 市 场 研 究 属 于 企 业 战 略 研 究 范 畴, 作 为 当 前 应 用 最 为 广 泛 的 咨 询 服 务, 其 研 究 报 告 形 式 呈 现, 通 常 包 含 以 下 内 容 : 一 份 专 业 的 行 业 研 究 报 告, 注 重 指 导 企 业 或 投 资 者 了 解 该

试卷代号 : 座位号 中央广播电视大学 学年度第一学期 " 开放本科 " 期末考试 数据结构试题 2011 年 1 月 题号一四五总分一一 分数 得分 评卷人 一 单项选择题, 在括号内填写所选择的标号 ( 每小题 2 分, 共 1 8 分 ) 1. 执行下

杭师大党字〔2011〕15号中共杭州师范大学委员会关于进一步加强和改进发展党员工作的意见

<4D F736F F D A67EAF64BEC7BCFABEC7AAF7C2B2B3B95FA5FEB3A1AAA95F2D31312E31362E646F63>

得 依 法 召 集 股 東 臨 時 會 第 十 一 條 : 股 東 常 會 之 召 集 應 於 開 會 三 十 日 前, 股 東 臨 時 會 之 召 集 應 於 開 會 十 五 日 前, 將 開 會 日 期 地 點 及 召 集 事 由 通 知 各 股 東 並 公 告 之 第 十 二 條 : 本 公

Transcription:

相信大家对树的各种递归的遍历很了解, 利用递归使得代码变得简单而且比较好理解, 但是利用递归是需要代价的, 特别是当递归层次比较深的时候, 可能会导致递归栈溢出 而且递归一般运行速度比较慢, 那么这种情况下, 我们就可以采用非递归来实现, 非递归相对递归来说, 代码相对比较难理解, 而且代码量也一般比较多, 可是它的执行效率却是很不错的 在树的中序非递归遍历中需要用到栈, 在层次遍历中需要用到队列, 非递归中序遍历的思想如下 : 1. 先设一个栈 st 和一个指向树根的指针 pval, 用 pval 指指向结点的 m_pleft( 左孩子 ) 并顺其而下直到 pval ==NULL 跳出循环, 在这一过程中把每个节点入栈, 则此时的 pval 指向的是树的最左结点 2. 栈顶元素出栈以访问最左结点 ( 此步很重要, 是为了实现按栈内元素的顺序后入先出访问结点访问最左结点的根结点 栈内元素逐一退栈即为中序遍历的元素顺序 ) 3. 访问最左结点的根结点 4. 由于将右子树理解为一个子树, 对其的遍历也是采用中序遍历的方法, 故将右子树的根结点理解为开始遍历树时的根结点, 故可用语句 pval = pval->m_pright, 则又开始了对一个树的遍历,pVal 指针又会走遍右子树的每一个结点 非递归中序遍历的思想如下 : 1. 按层次遍历需要一个队列, 开始将二叉树的头结点入队 2. 然后每次从队列中删除一个节点并输出节点信息, 接下来把它的非空 3. 左右孩子入队, 下一个输出的位它的右面堂兄弟或兄弟节点信息, 在把它的 4. 左右孩子入队, 这两个孩子在上面两个孩子的后面 ( 紧跟其后 ) 5. 这样当队列为空时算法结束 算法实现 : #include <stdio.h> #include <stdlib.h> // Author: 过往记忆 // Email: wyphao.2007@163.com // Blog: https://www.iteblog.com // TreeNode ////////////////////////////////////////////////////////////////////////// typedef struct TreeNode char m_cval; TreeNode* m_pleft; TreeNode* m_pright; 1 / 7

; TreeNode(char cval); ~TreeNode(); TreeNode::TreeNode(char cval) m_cval = cval; m_pleft = 0; m_pright = 0; TreeNode::~TreeNode() //Stack ////////////////////////////////////////////////////////////////////////// class Stack public: Stack(int iamount = 10); ~Stack(); //return 1 means succeeded, 0 means failed. int Pop(TreeNode* &pval); int Push(TreeNode* pval); int Top(TreeNode* &pval); //1 means not null, 0 means null. int NotNull(); private: TreeNode **m_ppdata; int m_icount; int m_iamount; ; Stack::Stack(int iamount) m_ppdata = new TreeNode*[iAmount]; m_icount = 0; m_iamount = iamount; Stack::~Stack() 2 / 7

delete m_ppdata; int Stack::Pop(TreeNode* &pval) if(m_icount>0) --m_icount; pval = m_ppdata[m_icount]; int Stack::Push(TreeNode* pval) if(m_icount<m_iamount) m_ppdata[m_icount] = pval; ++m_icount; int Stack::Top(TreeNode* &pval) if(m_icount>0 && m_icount<=m_iamount) pval = m_ppdata[m_icount-1]; int Stack::NotNull() if(m_icount!=0) //Queue ////////////////////////////////////////////////////////////////////////// class Queue 3 / 7

public: Queue(int nmounts); ~Queue(); //operator int EnQueue(TreeNode *node); int DeQueue(TreeNode *&node); int IsFull(); int IsEmpty(); private: TreeNode **Q; int front; int rear; int totalnode; ; Queue::Queue(int nmounts = 10) Q = new TreeNode*[nMounts]; totalnode = nmounts; rear = 0; front = 0; Queue::~Queue() delete Q; int Queue::EnQueue(TreeNode *node) if(!isfull()) Q[rear] = node; rear = (rear + 1) % totalnode; else //printf("queue is full!\n"); int Queue::DeQueue(TreeNode *&node) if(!isempty()) node = Q[front]; front = (front + 1) % totalnode; else //printf("queue is empty!\n"); 4 / 7

int Queue::IsFull() if((rear + 1) % totalnode == front) int Queue::IsEmpty() if(rear == front) int main(int argc, char* argv[]) TreeNode na('a'); TreeNode nb('b'); TreeNode nc('c'); TreeNode nd('d'); TreeNode ne('e'); TreeNode nf('f'); TreeNode ng('g'); TreeNode nh('h'); TreeNode ni('i'); TreeNode nj('j'); TreeNode nk('k'); TreeNode nl('l'); na.m_pleft = &nb; na.m_pright = &nc; nb.m_pright = &nd; nd.m_pright = &ng; nc.m_pleft = &ne; nc.m_pright = &nf; nf.m_pright = &nh; nh.m_pleft = &ni; nh.m_pright = &nj; ni.m_pleft = &nk; ni.m_pright = &nl; 5 / 7

Stack st; // 非递归中序遍历 TreeNode *pval = &na; int ipopped = 0; while(pval!=0) if(pval->m_pleft!=0 && ipopped==0) st.push(pval); pval = pval->m_pleft; ipopped = 0; else if(pval->m_pright!=0) printf("%c ", pval->m_cval); pval = pval->m_pright; ipopped = 0; else printf("%c ", pval->m_cval); if(0==st.pop(pval)) break; ipopped = 1; printf("\n"); // 层次遍历 pval = &na; Queue queue; while(pval!= NULL) if(pval->m_pleft!= NULL && pval->m_pright!= NULL) queue.enqueue(pval->m_pleft); queue.enqueue(pval->m_pright); else if(pval->m_pleft!= NULL) queue.enqueue(pval->m_pleft); else if(pval->m_pright!= NULL) queue.enqueue(pval->m_pright); printf("%c ", pval->m_cval); if(0 == queue.dequeue(pval)) break; 6 / 7

Powered by TCPDF (www.tcpdf.org) printf("\n"); 本博客文章除特别声明, 全部都是原创! 转载本文请加上 : 转载自过往记忆 (https://www.iteblog.com/) 本文链接 : () 7 / 7