1.递归版
java
public static class TreeNode{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
// 先序: (根) -> 左 -> 右
// 中序: 左 -> (根) -> 右
// 后序: 左 -> 右 -> (根)
public static void f(TreeNode head){
if (head == null) {
return;
}
// 1
f(head.left);
// 2
f(head.right);
// 3
}
// 先序遍历,递归
public static void preOrder(TreeNode head){
if (head == null) {
return;
}
System.out.println(head.val + " ");
preOrder(head.left);
preOrder(head.right);
}
// 中序遍历,递归
public static void inOrder(TreeNode head){
if (head == null) {
return;
}
inOrder(head.left);
System.out.println(head.val + " ");
inOrder(head.right);
}
// 后序遍历,递归
public static void posOrder(TreeNode head){
if (head == null) {
return;
}
posOrder(head.left);
posOrder(head.right);
System.out.println(head.val + " ");
}
2.非递归版
2.1 先序遍历
java
// 先序打印 非递归
public static void preOrder(TreeNode head){
if (head != null) {
Stack<TreeNode> stack = new Stack<>();
stack.push(head);
while (!stack.isEmpty()) {
head = stack.pop();
System.out.println(head.val + " ");
if (head.right != null) {
stack.push(head.right);
}
if (head.left != null) {
stack.push(head.left);
}
}
System.out.println();
}
}
2.2中序遍历
java
// 中序打印 非递归
// 1.子树头、左边界进栈
// 2.栈弹出一个节点打印,节点右树进栈
// 3.没有子树且栈空
public static void inOrder(TreeNode head){
if (head != null) {
Stack<TreeNode> stack = new Stack<>();
while (!stack.isEmpty() || head == null) {
if (head != null) {
stack.push(head);
head = head.left;
}
else {
head = stack.pop();
System.out.println(head.val + " ");
head = head.right;
}
}
System.out.println();
}
}
2.3后续遍历(1)
java
// 后续打印
// 先序: (根) -> 左 -> 右
// 先序': (根) -> 右 -> 左
// 反转: 左 -> 右 -> (根)
public static void posOrder(TreeNode head){
if (head != null) {
Stack<TreeNode> stack = new Stack<>();
Stack<TreeNode> collect = new Stack<>();
stack.push(head);
while (!stack.isEmpty()) {
head = stack.pop();
collect.push(head);
if (head.left != null) {
stack.push(head.left);
}
if (head.right != null) {
stack.push(head.right);
}
}
while (!collect.isEmpty()) {
System.out.println(collect.pop().val + " ");
}
}
}
2.4后续遍历(2)
java
public static void posOrderOneStack(TreeNode h){
if (h != null) {
Stack<TreeNode> stack = new Stack<>();
stack.push(h);
// 如果始终没有打印节点,h就一直是头结点
// 一旦打印过节点,h就变成打印节点
// 之后h含义:上一次打印的节点
while (!stack.isEmpty()) {
TreeNode cur = stack.peek();
if (cur.left != null
&& h != cur.left
&& h != cur.right) {
// 有左树且左树未处理
stack.push(cur.left);
}
else if (cur.right != null
&& h != cur.right) {
// 有右树且右树未处理
stack.push(cur.right);
}
else{
// 没有左树 右树 或者左树右树都处理了
System.out.println(cur.val + " ");
h = stack.pop();
}
}
System.out.println();
}
}