绝大多数可以用递归解决的问题,其实都可以用另一种数据结构来解决,这种数据结构就是栈。
因为递归和栈都有回溯的特性。
如何借助栈来实现二叉树的非递归遍历呢?下面以二叉树的前序遍历为例,看一看具体过程。
1.首先遍历二叉树的根节点1,放入栈中。
2.遍历根节点1的左孩子节点2,放入栈中
3.遍历节点2的左孩子节点4,放入栈中。
4.节点4既没有左孩子,也没有右孩子,我们需要回溯到上一个节点2。可是现在并不是做递归操作,怎么回溯呢?
别担心,栈已经存储了刚才遍历的路径。让旧的栈顶元素4出栈,就可以重新访问节点2,得到节点2的右孩子节点5。
此时节点2已经没有利用价值(已经访问过左孩子和右孩子),节点2出栈,节点5入栈
5.节点5既没有左孩子,也没有右孩子,我们需要再次回溯,一直回溯到节点1。所以让节点5出栈。
根节点1的右孩子是节点3,节点1出栈,节点3入栈。
6.节点3的右孩子是节点6,节点3出栈,节点6入栈
7.节点6既没有左孩子,也没有右孩子,所以节点6出栈。此时栈为空,遍历结束。
/**
* 前序遍历,非递归
* @param node
*/
public void noFunFrontShow(TreeNode node) {
// 1. 定义一个栈
Stack<TreeNode> stack = new Stack<>();
// 如果当前节点不为空,栈不为空
while (node != null || stack.size() > 0) {
// 如果节点不为空
while (node != null) {
// 输出节点数据
System