我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

二叉树遍历的非递归实现

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

创新互联专注于企业营销型网站建设、网站重做改版、雁塔网站定制设计、自适应品牌网站建设、成都h5网站建设商城网站定制开发、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为雁塔等各大城市提供网站开发制作服务。

1.前序遍历

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

代码如下:

void _PrevOrder(Node * root)
	{
		stack 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 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 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://mswzjz.cn/article/ghigpc.html

其他资讯