// 非递归前序遍历 public void preOrderTraversal() { preOrder1(root); } private void preOrderTraversal(Node x) { LinkedList<Node> list = new LinkedList<>(); while (x != null || !list.isEmpty()) { while (x != null) { System.out.print("[" + x.key + ":" + x.value + "]" + " "); list.addFirst(x); x = x.lchild; } if (!list.isEmpty()) { x = list.removeFirst(); x = x.rchild; } } } // 中序遍历:左子树--根节点--右子树 public void inorderTraversal() { inorderTraversal(root); } private void inorderTraversal(Node x) { LinkedList<Node> stack = new LinkedList<>(); while (x != null || !stack.isEmpty()) { while (x != null) { stack.addFirst(x); x = x.lchild; } Node node = stack.removeFirst(); System.out.print("[" + node.key + ":" + node.value + "]" + " "); x = node.rchild; } } // 后续遍历思想: 左-右-根;可以视为, 根-右-左,然后结果转置即可. public void postOrderTraversal() { postOrderTraversal(root); } private void postOrderTraversal(Node x) { LinkedList<Node> stack = new LinkedList<>(); LinkedList<Node> list = new LinkedList<>(); stack.addFirst(x); while (!stack.isEmpty()) { Node node = stack.removeFirst(); list.add(node); if (node.lchild != null) stack.push(node.lchild); if (node.rchild != null) stack.push(node.rchild); } Collections.reverse(list); for (Node node : list) { System.out.print("[" + node.key + ":" + node.value + "]" + " "); } }
借鉴文章:https://my.oschina.net/husthang/blog/852982