非递归先序遍历二叉树

为什么非递归?

 众所周知,二叉树的递归遍历 = 三行代码,那么什么要使用非递归去实现呢?

1.难度高的面试、考试可能会考(比较重要)

2.帮助我理解栈和递归的关系(有点重要但不是那么重要)

非递归的思路

 所谓非递归,不过是通过使用栈去把递归的过程模拟出来罢了。栈的操作也很简单:左子能入就入左子,右子能入就入右子,没有子入就弹出。

非递归的代码(先序)

/*
用例   
1234567#8####9#####
1234567########
73914#####5#6##
*/
void pre_travel_tree_norecursion(biTree* root)
{
	if(root==NULL)
		return;
	node stack[20] ;
	for(int i = 0; i <20;i++)
	{
		stack[i].left_has_get = false;
		stack[i].right_has_get=false;
		stack[i].this_has_get = false;
	}
	int top = 0;
	stack[top].data = root; //用键值对的方式去思考
	while(top>-1)
	{
		if(!stack[top].this_has_get)
		{
			printf("%d  ",stack[top].data->data);
			stack[top].this_has_get = true;
		}
		// ------------------------------------
		//左子可访问,访问左子
		if(stack[top] .data->leftSon != NULL && (!stack[top].left_has_get ))
		{
			stack[top].left_has_get = true;
			stack[top+1].data = stack[top].data->leftSon;
			stack[top+1].left_has_get=false;
			stack[top+1].right_has_get=false;
			stack[top+1].this_has_get =false;
			top ++ ;

			continue;
		}
		//右子可访问,访问右子
		if(stack[top] .data->rightSon != NULL && (!stack[top].right_has_get ) )
		{
			stack[top].right_has_get = true;
			stack[top+1].data = stack[top].data->rightSon;
			stack[top+1].left_has_get=false;
			stack[top+1].right_has_get=false;
			stack[top+1].this_has_get =false;
			top ++ ;
			continue;
		}
		top -- ;

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值