树的非递归前中后序 ~

由于递归容易导致栈溢出,所以我们采用非递归进行处理

非递归采用 循环和栈 的方式进行处理

一、前序

//前序
void PreOrderLoop(TreeNode *pRoot)
{
	TreeNode *pCur = pRoot;
	Stack stack;  //定义一个栈
	TreeNode *pTop;   //栈顶元素
	stackInit(&stack);
	while (!stackIsempty(&stack) || pCur != NULL)  //循环条件
	{
		while (pCur != NULL)   
		{
			printf("%c ", pCur->data);  //打印结点数据
			stackPush(&stack, pCur);   //进行入栈
			pCur = pCur->pleft;    //再去遍历他的左子树
		}
		pTop = stackTop(&stack);   //循环退出 左子树全部遍历完
		stackPop(&stack);       //将栈顶元素出栈
		pCur = pTop->pright;   //再去遍历此时根的左子树
	}
}

二、中序

//中序
void InOrderLoop(TreeNode *pRoot)
{
	TreeNode *pCur = pRoot;
	Stack stack;
	TreeNode *pTop;
	stackInit(&stack);
	while (!stackIsempty(&stack) || pCur != NULL)
	{
		while (pCur != NULL)
		{
			stackPush(&stack, pCur);
			pCur = pCur->pleft;
		}
		pTop = stackTop(&stack);
		stackPop(&stack);
		printf("%c ", pTop->data);  
		pCur = pTop->pright;
	}
}

 

三、后序

 

后序这里我们要考虑的比前面两个多一点,首先:我们会定义一个plast变量来表示上一次已经被后序遍历完的根

我们打印的条件分为两种:(1)右子树为空  (2)右子树已经被遍历

若符合则进行打印,否则遍历此结点的右子树

代码如下~

//后序
void PostOrderLoop(TreeNode *pRoot)
{
	TreeNode *pCur = pRoot;
	Stack stack;
	TreeNode *pTop=NULL;
	TreeNode *plast = NULL; //表示上一次已经被后序遍历完的树的根
	stackInit(&stack);
	while (!stackIsempty(&stack) || pCur != NULL)
	{
		while (pCur != NULL)
		{
			stackPush(&stack, pCur);
			pCur = pCur->pleft;
		}
		//没有被遍历的 还剩栈里的右子树和根
		pTop = stackTop(&stack);
		if (pTop->pright == NULL || pTop->pright == plast)
		{
			printf("%c ", pTop->data);
			stackPop(&stack);
			plast = pTop;
			continue;
		}
		//遍历top的右子树,成为子问题
		pCur = pTop->pright;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值