二叉树非递归的三种遍历方式

在学习二叉树的过程中学会的比较易懂的非递归遍历方式:

#include <iostream>
using namespace std;
typedef struct btree
{
    
    
	int val;
	btree* left;
	btree* right;
}*pbtree;
pbtree stack[10];
int stacksize = -1;
//首先是先序遍历
void printfirst(pbtree tree)
{
    
    
	pbtree pmove = tree;
	while (stacksize != -1 || pmove)
	{
    
    
		while (pmove)
		{
    
    
			cout << pmove->val<<"\t";
			stack[++stacksize] = pmove;
			pmove = pmove->left;										//printfirst(pmove->left);
		}
		if (stacksize != -1)
		{
    
    
			pmove = stack[stacksize--];
			pmove = pmove->right;													//printfirst(pmove->right);
		}
	}
}
//接着是中序遍历,跟前序遍历大同小异
void printsecond(pbtree tree)
{
    
    
	pbtree pmove = tree;
	while (pmove || stacksize != -1)
	{
    
    
		while (pmove)
		{
    
    
			stack[++stacksize] = pmove;
			pmove = pmove->left;		//注意一下,我写成了printsecond(pmove->left);根本不用递归
		}
		if (stacksize != -1)
		{
    
    
			pmove = stack[stacksize--];
			cout << pmove->val<<"\t";
			pmove = pmove->right;		//这里也是,我写成了printsecond(pmove->right);
		}
	}
}
//最后是后续遍历,跟前两种比起来,主要是多了一个监测变量;
void printlast(pbtree tree)
{
    
    
	pbtree pmove=tree, ppmove = nullptr;
	
		while(pmove)			//这里比较细节要将pmove||stacksize!=-1这两个条件分开。
			{
    
    
			stack[++stacksize] = pmove;
			pmove = pmove ->left;
			}
		while(stacksize!=-1)				//将pmove||stacksize!=-1这两个条件分开。
		{
    
    
			if (stacksize != -1)
			{
    
    
				pmove = stack[stacksize--];
				if (pmove->right == nullptr || pmove->right == ppmove)
				{
    
    
					cout << pmove->val << "\t";
					ppmove = pmove;
				}
				else
				{
    
    
					stack[++stacksize] = pmove;//这步很重要,因为刚刚弹了一次栈,如果是现在的情况就必须重新入栈
					pmove = pmove->right;
					while (pmove)					//我觉得这个循环用不上,记得测试一下,最后发现,必须要,因为这里跟前序和中序有不同指出;
					{
    
    
						stack[++stacksize] = pmove;
						pmove = pmove->left;
					}
				}
			}
		}
	}

int main()
{
    
    
	btree tree = {
    
     1,nullptr,nullptr };
	btree tree1 = {
    
     2,nullptr,nullptr };
	btree tree2 = {
    
     3,nullptr,nullptr };
	btree tree3 = {
    
     4,&tree,nullptr };
	btree tree4 = {
    
     5,&tree2,&tree1 };
	btree tree5 = {
    
     6,&tree4,&tree3 };
	printfirst(&tree5);
	cout << endl;
	printsecond(&tree5);
	cout << endl;
	printlast(&tree5);
	cout << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_51721904/article/details/121044167