树的非递归遍历

1. 概述:

1) 线序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同

2) 非递归算法实现的基本思路:使用堆栈

3) 如图:

树的非递归遍历_第1张图片

2. 中序遍历非递归遍历算法:

1) 遇到一个结点,就把他压栈,病区遍历他的左子树

2) 当左子树遍历结束后,从栈顶弹出这个结点并访问它

3) 然后按其右指针再去中序遍历该结点的右子树

void InOrderTravelsal(BinTree BT)
{
	BinTree T = BT;
	Stack S= CreateStack(MaxSize);/*创建并初始化堆栈S*/
	while(T || !IsEmpty(S))
	{
		while(T)/*一直向左并将沿途结点压入堆栈*/
		{
			Push(S, T);
			T = T->Left;
		}
		if(!IsEmpty(S))
		{
			T = POP(S);/*结点弹出堆栈*/
			printf("%5d", T->Data);/*(访问)打印结点*/
			T = T->Right;/*转向右子树*/
		}
	}
}
3. 先序遍历非递归:

void PreOrderTravelsal(BinTree BT)
{
	BinTree T = BT;
	Stack S= CreateStack(MaxSize);/*创建并初始化堆栈S*/
	while(T || !IsEmpty(S))
	{
		while(T)/*一直向左并将沿途结点压入堆栈*/
		{
			Push(S, T);
			printf("%5d", T->Data);/*(访问)打印结点*/
			T = T->Left;
		}
		if(!IsEmpty(S))
		{
			T = POP(S);/*结点弹出堆栈*/
			T = T->Right;/*转向右子树*/
		}
	}
}



你可能感兴趣的:(树的非递归遍历)