二叉树遍历的非递归实现

原创 2016年06月01日 19:01:35

二叉树的遍历可以使用递归的方式实现,并且代码非常简单。而递归实际就是函数反复的调用本身,在栈上反复压栈。所以我们可以用栈来模拟实现递归。

1.前序遍历

  (1)栈是后进先出的特点,所以无条件的把栈的根节点入栈,在把栈顶元素输出之后依次把右孩子,左孩子压入栈中。


代码如下:

void _PrevOrder(Node * root)
	{
		stack<Node*> s;
		if (root == NULL)
		{
			return;
		}

		s.push(root);//将第一个元素入栈

		while (!s.empty())//当栈不为空时
		{
			root = s.top();
			cout << root->_data << "->";//打印节点
			s.pop();
			//栈的特点,后进先出,所以,先压右子树
			if (root->_right)//遍历右子树
			{
				s.push(root->_right);
			}
			if (root->_left)//遍历左子树
			{
				s.push(root->_left);
			}
		}
	}


2.中序遍历

  (1)一直入栈,一直到二叉树的最左边最下边的节点。

  (2)按照中序遍历的特点:左子树->根节点->右子树,输出栈顶的元素,并且弹出,必须保留该节点的指针。

  (3)此时,该判断此节点的右子树:

            a.右子树为NULL,返回到栈顶;

            b.右子树不为NULL,把该节点当根节点,重复(1)(2)(3)......  

  

代码如下:

	void _InOrder(Node * root)
	{
		if (root == NULL)
		{
			return;
		}
		Node * cur = root;
		stack<Node *> s;
		while (cur || !s.empty())
		{
			while (cur)//当没有左子树时,停止入栈
			{
				s.push(cur);
				cur = cur->_left;
			}
			Node * top = s.top();//保留栈顶指针,判断是否有右子树
			cout << top->_data << "->";
			s.pop();

			if (top->_right == NULL)//没有右子树时,不需要压栈
			{
				cur = NULL;
			}
			else//当存在右子树时,把右子树的根节点压入栈中,循环去判断该节点的左子树是否存在
			{
				cur = top->_right;
			}
		}
	}

 

3.后序遍历

  (1)一直入栈,一直到二叉树的最左边最下边的节点。

  (2)按照后序遍历的特点:左子树->右子树->根节点,输出栈顶的元素,并且弹出,必须保留该节点的指针。

  (3)此时,该判断此节点的右子树,如果存在右子树,把该节点当作根节点,重复(1)(2)(3)


代码如下:

	void _PostOrder(Node * root)
	{
		if (root == NULL)
		{
			return;
		}
		Node * cur = root;
		Node * prev = NULL;
		stack<Node *> s;

		while (cur || !s.empty())
		{
			while (cur)//当没有左子树时,停止入栈
			{
				s.push(cur);
				cur = cur->_left;
			}

			Node * top = s.top();//保留栈顶指针,判断它的右子树是否为空或者已经出栈
			if (top->_right == NULL || top->_right == prev)
			{
				cout << top->_data << "->";
				s.pop();
				prev = top;//保留出栈元素的指针
				cur = NULL;
			}
			else//当存在右子树时,把右子树的根节点压入栈中,循环去判断该节点的左子树是否存在
			{
				cur = top->_right;
			}
		}
	}


本文出自 “不断进步的空间” 博客,请务必保留此出处http://10824050.blog.51cto.com/10814050/1767107

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树遍历的非递归实现

二叉树的非递归实现先序遍历(先根再左后右)算法思想: (1)先头节点入栈,并访问该节点 (2)循环遍历当前节点,直至左孩子没有节点 (3)查看当前节点是否有右孩子。若有,回到步骤(1)。若无,退...

二叉树遍历的非递归实现 java版本

前序非递归遍历基本思想: 首先从访问节点,访问完后将节点入栈,如果节点有左孩子,则变量指向左孩子重复以上顺序当左孩子为空时,则出栈,获得栈顶元素的右孩子(所有入栈的元素及其左孩子元素都是被访问过...

二叉树遍历的非递归实现(java版)

在前面的这篇文章中我写了二叉树遍历的递归实现,在这篇文章中我将讲述下二叉树的非递归实现。大多数的递归问题的非递归算法,需要用栈来消除递归。栈是一种存储容器,同时又是一种控制结构,栈先进先出的控制结构,...

二叉树遍历(非递归实现--栈实现)

和上一篇一样先建了一颗树用于实验:实现了三种遍历方法:先序遍历,中序遍历,后序遍历。以以上的树为例输出的结果应为:A, B, D, C, E, F; B, D, A, E, C, F; D, B, E...

二叉树遍历的非递归实现

作者:冯老师,华清远见嵌入式学院讲师。 一、递归的定义及特点 递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出。递归问题...

二叉树遍历的非递归实现

前面对二叉树的遍历都是用的

二叉树遍历的非递归实现

作者:冯老师,华清远见嵌入式学院讲师。 一、递归的定义及特点 递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出。递归问题...

三种二叉树遍历的非递归实现

今天偶然翻出了很久以前写的一篇博客,是关于三种二叉树遍历的非递归实现的,转到这儿来吧。程序都是伪代码,因为是考研复习期间写的,数据结构参考了严蔚敏的《数据结构》。 先看递归实现: void Trav...

二叉树遍历(先序、中序、后序、深度、广度)递归和非递归实现

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。二叉树的遍历方式分为深度遍历和广度遍历,深度遍历包括前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因...

二叉树遍历的递归与非递归实现(C++)

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树遍历的非递归实现
举报原因:
原因补充:

(最多只允许输入30个字)