题目一:实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式
递归版:递归来到每个节点的顺序
前序遍历 打印时机放在第1次来到这个节点的时候
中序遍历 打印时机放在第2次来到这个节点的时候
后序遍历 打印时机放在第3次来到这个节点的时候
// 递归版本--先序遍历 public static void preOrderRecur(Node head) { if (head == null) { return; } // System.out.print(head.value + " "); preOrderRecur(head.left); preOrderRecur(head.right); }
非递归版:stack栈
1,2,4,5,3,6,7
// 非递归--前序遍历 public static void preOrderUnRecur(Node head) { System.out.print("pre-order: "); if (head != null) { Stack<Node> stack = new Stack<Node>(); stack.add(head); while (!stack.isEmpty()) { head = stack.pop(); System.out.print(head.value + " "); //如果有右孩子,先压右 // 如果有左孩子,后压左 if (head.right != null) { stack.push(head.right); } if (head.left != null) { stack.push(head.left); } } } System.out.println(); }
中左右被 模拟出来了
先压右后压左
先弹左,后弹右
为什么不用队列?
递归函数就是一种栈
二叉树只有从上到下的路径,没有回去的路径