这里还是用到栈的思想,为了方便用了c++的一些内容,把出栈,进栈,读栈顶元素用一个个函数封装起来了,前面做了一些处理来使用这些函数。
前序非递归
思想:一直走左边,依次进栈。等左边为空的时候,返回,也就是读栈顶元素,读一个出一个,并让cur指向它的右边,把它的右边的结点当作根结点,再走一边上面的过程。
中序非递归
前序是在访问根结点时打印,中序是先访问左结点,所以在指向左结点时打印,也就是一直往左走依次入栈,走到头返回读栈顶元素并出栈时打印就行,然后cur等于当前栈顶元素的右子树,再把这个结点当根结点,再走一边这样的过程。
后序非递归
比较难想,要有一个指针last指向上一次操作完整遍历完的树的结点也就是这个结点是当前最底下的那个结点。
一直往左并入栈,走到头把top指上去,如果top的右边为空,打印并出栈,否则看右边是不是last如果是也打印出栈,
否则没有跑到右边最后一个,(如果跑到了,肯定是打印出栈,最后一个就变了)。cur就等于当前栈顶元素的右子树。