前几天看听了一个递归到非递归变换的讲座,有些心得不敢独享。故拿出来同大家一起讨论。
三种序列遍历二叉树都要用到栈,栈起的作用是保存树顶的结点以便返回时出栈调用。
先序:按先序的顺序,访问完根要遍历其左子树。若其左子树的度不为零,则要先遍历完左子树才能去遍历根的右子树,而且在树下的要比树上的优先遍历。由此特性,可以用到栈的后入先出特点,把根结点逐一入栈,带左子树访问完时再出栈获得根的地址,再遍历右子树。
由此进一步讨论,递归转非递归将经历保存当前函数的变量并将其入栈、调用被调用函数、控制权交给被调用函数,而返回状态时将经历保存被调用函数的变量和返回值即出栈、控制权转交给调用函数、返回值返回给调用函数。由此可见,再将递归函数转化成非递归函数时,入栈的是调用函数的变量,而当返回时要将被调用函数的变量出栈并将出栈之中的返回值返回给主调函数。