5.1增加二叉树非递归后续遍历

//感谢MOOC里的大神,选了一种最为方便的写法
//另外还可以在树结构中增加一个记录访问次数的选项
//那个更容易理解,但是麻烦,也贴在后面

typedef struct TREE
{
int data;
int visit; //用来记录节点的访问次数
struct TREE * left;
struct TREE * right;
}*BinTree , Tnode;

void postra1111(BinTree BT)
{
BinTree pre = NULL ; //增加一个记录上一个节点
BinTree T = BT;
Stack S = create_stack(MAXSIZE);

while ( T || !Is_empty(S) )
{
	while (T)
	{
		push(S, T);
		T = T->left;
	}
	T = pop(S);
	if(T->right==NULL || pre == T->right)
	{
		printf("%3c", T->data);
		pre = T;
		T = NULL;//这一步很关键;
		//没有这一步就无限循环了
	}
	else
	{
		//如果右儿子不为空,且没有访问过右儿子
		push(S, T);
		T = T->right;
	}			
}
return ;

}

void posttraversal(BinTree T)
{
BinTree work = T;
Stack S = create_stack(MAXSIZE);

while (work || !Is_empty(S))
{
	while (work)
	{
		if (work->visit == 0)
		{
			(work->visit)++;
			push(S, work);

		}
		work = work->left;
	}
	if (!Is_empty(S))
	{
		work = pop(S);
		if ( (work->visit) == 2)
		{
			printf("%3c",work->data);
			work=NULL;
		}
		else
		{
			(work->visit)++;
			push(S, work);
			work = work->right;
		}
	}
}
return ;

}

/*
*
*
*/
//二叉数的层次遍历,借助循环队列
//注意循环队列的插入删除的方式
//下次研究一下借助堆栈如何实现
void leveltraversal(BinTree BT)
{
Queue Q = crea_queue(MAXSIZE);
BinTree T;
if (!BT)
{
return;
}
AddQ(Q, BT);
while (!is_empty(Q))
{
T = deleteQ(Q);
printf("%3c",T->data);
if (T->left)
{
AddQ(Q, T->left);
}
if (T->right)
{
AddQ(Q, BT->right);
}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值