为什么非递归?
众所周知,二叉树的递归遍历 = 三行代码,那么什么要使用非递归去实现呢?
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 -- ;
}
}