二叉树遍历的非递归算法实现

5 篇文章 0 订阅
4 篇文章 0 订阅

linux c++ 模板类

*Author: passions_yang 1354001475@qq.com *

讨论范围

本博客只实现二叉树非递归算法的遍历,请自行学习二叉树和模板类等相关知识。代码中附带大量注释,所以就不在进行详细说明。

中序遍历

template <typename T>void Post<T>::NInOrder11(BTNode<T> *t)
{
	BTNode<T> *buf[MAXSIZE];
	BTNode<T> *p = NULL;
	int top = -1;
	p = t;
	while(top != -1 || p != NULL)//判断栈是否为空
	{
		while(p != NULL)//判断左子树是否为空
		{
			buf[++top] = p;//如果不为空,则进栈
			p = p->lchild;
		}
		if(top != -1)//判断栈中是否有元素
		{
			p = buf[top--];//得到没有左子树为空的父亲节点
			cout<<p->data<<" ";//输出当前节点
			p = p->rchild;//找当前节点的右子树,将右子树赋给p,再对他进行判断
		}
	}
}

后序遍历

template <typename T>void Post<T>::NPostOrder11(BTNode<T> *t)
{//{
	BTNode<T> *buf[MAXSIZE];
	BTNode<T>* p = NULL;
	int top = -1;
	p = t;
	//后续遍历算法
	bool flag;//设立标志位,用于判断左子树是否为空
	BTNode<T> *q;
	do 
	{
		while(p != NULL)//判断左子树是否为空
		{
			buf[++top] = p;//将左子树全部入栈
			p = p->lchild;
		}
		q = NULL;//这个用于判断右子树是否为NULL
		flag = true;//设立标志位,标志左子树已经为空
		while(top != -1 && flag == true)//判断栈是否为空,并且左子树已经为空
		{
			p = buf[top];//将栈中的元素取出来,赋给p,top--不能写到这里
			//因为,如果当前节点的右子树与上一次退栈的节点相同时
			//我没才需要进行退栈,

			if(p->rchild == q)//判断右子树是否为空
			{
				cout<<p->data<<" ";//打印的是没有左子树和右子树的节点
				--top;
				q = p;//将上一次打印的节点记录下来
			}else
			{
				p = p->rchild;//将指针下移
				flag = false;//将标志位设置为false,意思是左子树不为空
				//并且将循环移出,重复do while循环,让他继续判断右子树的左子树是否为空
			}
		}
	} while (top != -1);//判断栈是否为空

}

请仔细阅读,深入理解算法。对于以后将一些递归算法转换为非递归算法,在思想上有很大帮助。在转换上可以使用栈、队列、数组等均可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值