后根遍历用到的栈有一些特殊,栈中元素要出栈两次才会被真正出栈。也就是说:
该栈的链式存储节点的定义如下:
例如:
栈的某个节点的skip = 0时,只需执行一次出栈操作即可正常出栈。
栈的某个节点的skip = 1时,第一次出栈操作只会返回该节点数据域中的数据,第二次出栈操作才会真正的出栈(当然数据域中的数据也返回)
栈的某个节点的skip = 2时,前两次出栈操作只会返回该节点数据域中的数据,第三次出栈操作才会真正的出栈(当然数据域中的数据也返回)
......
通过比较二叉树的先根遍历,中根遍历,后根遍历的非递归算法可以发现:这三个算法的实现是极其相似的(如同它们递归算法的也很相似一般)。
1:都用到了栈来暂存节点。
2:都是两个while的嵌套循环。
3: 如果除去访问节点的语句,先根遍历和中根遍历是完全相同的,后根遍历也只是出栈函数的参数不同而已。