定义节点:
class Node{ String val; Node left; Node right; public Node(String val){ this.val = val; } }非递归先序遍历思路: 1.初始化栈,将根节点入栈。 2.节点出栈,若其右、左子树不为空。则右、左子树入栈。(因为栈先进后出,所以先序时候要先右子树入,再左子树入) 重复以上2操作,一直到栈为空
//非递归先序遍历 public static void PreOrder2(Node root) { Stack<Node> stack = new Stack<>(); if (root == null) return; stack.push(root); while (!stack.isEmpty()) { Node tem = stack.pop(); System.out.print(tem.val + " "); if (tem.right != null) stack.push(tem.right); if (tem.left != null) stack.push(tem.left); } }非递归中序遍历: 1.先将根节点入栈 2.将当前节点的所有左子树入栈,直到左子树为空 3.访问栈顶元素,从栈顶元素的右子树开始,继续刚才的过程,直到栈为空即所有的节点都被访问
//非递归中序遍历思路如下: public static void MidOrder2(Node root) { if (root == null) return; Node cur = root; Stack<Node> stack = new Stack<>(); while (true) { // 1.先将根节点入栈 // 2.将当前节点的所有左子树入栈,直到左子树为空 while (cur != null) { stack.push(cur); cur = cur.left; } if (stack.isEmpty()) { break; } //3.访问栈顶元素,从栈顶元素的右子树开始,继续刚才的过程,直到栈为空即所有的节点都被访问 Node top = stack.pop(); System.out.print(top.val + " "); cur = top.right; } }非递归后序遍历: prev:标记最后一个被访问的节点,即下次被访问的节点的前一节点,也就是右子树。 cur:代替root节点 1.cur从root出发,循环往左找。遇到非空节点都入栈 2.获取栈顶元素判断:没有右子树,或者右子树已经被访问过,则可以访问栈顶元素 3.否则从当前栈顶元素的右子树循环第1,2,3步
//非递归后序遍历 public static void LastOrder2(Node root) { if (root == null) return; Node prev = null;//标记最后一个被访问的节点,即下次被访问的节点的前一节点,也就是右子树。 Node cur = root; Stack<Node> stack = new Stack<>(); while (true) { //1.cur从root出发,循环往左找。遇到非空节点都入栈 while (cur != null) { stack.push(cur); cur = cur.left; } if (stack.empty()) return; //2.获取栈顶元素值 Node top = stack.peek(); //3.没有右子树,或者右子树已经被访问过 if (top.right == null || top.right == prev) { //则可以访问栈顶元素 System.out.print(top.val+" "); stack.pop(); //prev记录最后一个被访问的节点,即下次被访问的节点的前一节点,也就是右子树 prev = top; } //否则从当前栈顶元素的右子树循环第1,2,3步 else { cur = top.right; } } }非递归层序遍历: 和先序的思路基本一样。只是存到列表里,而且顺序是正确的
//非递归层序遍历 public static void LevalOrder(Node root){ LinkedList<Node> list = new LinkedList<>(); if(root == null)return; list.add(root); while (list.isEmpty() == false ) { Node tem = list.poll(); System.out.print(tem.val+" "); if(tem.left != null){ list.add(tem.left); } if(tem.right != null){ list.add(tem.right); } } }