二叉树遍历的迭代实现 java实现二叉树的遍历

二叉树遍历的迭代实现 java实现二叉树的遍历

个人觉得中序遍历的迭代实现是三种遍历方式中较难的一种。

先来比较难的中序遍历。

其实思路很简单,就是先把root push进栈,然后不断迭代下述过程:把栈头节点pointer pop出来,假如这个pointer有子节点并且它的子节点没有被push进栈过,则把这个pointer的右节点R push进栈,再把pointer push进栈, 再把pointer的左节点Lpush进栈,最后再检查下栈头的节点是否可以被弹出来(注意这个时候的栈头节点有可能已经和pointer不相同了,有可能是pointer的左节点)。思路很简单,但是有个地方的逻辑必须得理顺,也就是a.你怎么判断当前pointer的如果有左右节点的话,这左右节点是否已经被push进栈过;b.把栈头真的pop掉的条件是什么?

首先解决a问题。首先很显然的是如果当前节点没有左右节点,则不需要push进栈;其次,如果这个节点的左子树已经被遍历到(已经被真的弹出栈),那说明这个节点的子节点已经在前面的某个时刻被push进栈,那么如何判断这个左子树是否已经被遍历到了呢?那就得看上次被真的pop出栈的节点out是否是当前这个节点的左子树中最后被中序遍历到的,这里又有两种情况,一种是中序遍历左子树的最后一个节点是当前节点的左节点也就是代码中的out!=null &&out==pointer.leftChild,另一种情况是中序遍历左子树的最后一个节点是当前节点的左节点的右子树上,这种情况下这个最后被遍历的节点无论如何都没有右节点。因此,总结下,就是三种情况(代码中有列出)。

其次解决b问题。这个判断条件完全与前一个问题一一对应。

最后代码如下:



后续遍历和上面的思路类似,代码如下:
前序遍历算是最简单的一种,代码如下:

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/142078.html

更多阅读

GBDTMART 迭代决策树入门教程|简介 mart gbdt

在网上看到一篇对从代码层面理解gbdt比较好的文章,转载记录一下: GBDT(GradientBoostingDecisionTree)又叫MART(MultipleAdditiveRegressionTree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它

转载 用SOR方法解方程组计算方法matlab matlab中sor迭代法

原文地址:用SOR方法解方程组计算方法matlab作者:不再彷徨function [Lw,f]=fifth1(A,b)%输入方程左端系数和右端向量,输出SOR方法的迭代矩阵,%及另一个系数s=size(A);%方程组左端系数矩阵的大小ss=size(b);f=zeros(ss(1),ss(2));%定义一

Struts迭代器iterator 遍历List常用的4种例子 struts2迭代器

【摘要】本文主要介绍及演示了Struts迭代器(iterator)遍历List常用的4种例子,基于MyEclipse开发环境,重点关注前后端代码的实现,给出后端java代码、前段struts标签代码,主要有如下4个例子:1.遍历List<String>2.遍历List<List<String>>3.遍

123数字黑洞的证明 探究数字黑洞

1 2 3 数 字 黑 洞 的 证 明1 何谓数字黑洞百度百科:黑洞原是天文学中的概念,表示这样一种天体:它的引力场是如此之强,就连光也不能逃脱出来。数学中借用这个词,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后,结果必然落入一

声明:《二叉树遍历的迭代实现 java实现二叉树的遍历》为网友心里的你分享!如侵犯到您的合法权益请联系我们删除