注释全在代码里面了。
先序遍历
对应leetcode题目:LC144
/**
*
* 遍历顺序:头左右
*
* @author zrulin
* @create 2022-03-15 21:05
*/
public class 先序遍历 {
//递归实现:
public static void preTraversal(Node head){
if(head == null){
return;
}
System.out.print(head.value+" ");
preTraversal(head.left);
preTraversal(head.right);
}
//非递归实现先序遍历:
//思想:递归就是系统帮你压栈,自己压栈就好了。弹出的顺序是头左右
/**
* 步骤:
* 1、头节点入栈
* 2、每次从栈中弹出一个节点var
* 3、处理(打印)var
* 4、先把var的右节点压入栈(如果有的话),在把var左节点压入栈(如果有的话)<!--如果想要头右左遍历的话,改一下这个步骤的先后顺序就好了-->
* 5、执行步骤二(周而复始)
*/
public static void preTraversalStack(Node head){
System.out.print("pre-order: ");
if(head != null){
Stack<Node> stack = new Stack<>();
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();
}
}
中序遍历
对应leetcode题目:LC94
/**
*
* 遍历顺序:左头右
*
* @author zrulin
* @create 2022-03-15 21:05
*/
public class 中序遍历 {
public static void inTraversal(Node head){
if(head == null) return;
inTraversal(head.left);
System.out.println(head.value + " ");
inTraversal(head.right);
}
//非递归实现中序遍历
//思想:先逮住一棵树,把他的左边界全部压入栈,在弹出每一个节点的过程中,打印并且让他的右树也这么干。
/**
*步骤:
* 1、先把以head为头节点的树的左边界全部压入栈
* 2、弹出一个节点var并处理(打印)这个节点
* 2、如果var有右节点,那么执行步骤1,如果没有则执行步骤2
*/
public static void inTraversalStack(Node head){
System.out.print("in-order: ");
if(head != null){
Stack<Node> stack = new Stack<>();
while (!stack.isEmpty() || head != null){
if(head != null){
stack.push(head);
head = head.left;
}else {
head = stack.pop();
System.out.print(head.value + " ");
head = head.right;
}
}
}
}
}
后序遍历
对应leetcode题目:LC145
/**
*
* 遍历顺序:左右头
*
* @author zrulin
* @create 2022-03-15 21:05
*/
public class 后序遍历 {
public static void posTraversal(Node head){
if(head == null) return;
posTraversal(head.left);
posTraversal(head.right);
System.out.println(head.value + " ");
}
//非递归实现后序遍历(理解不了的话再看看先序遍历,其实是在先序遍历的基础上进行改动的)
//思想:递归就是系统帮你压栈,自己压栈就好了,弹出的顺序是头右左,但是该打印的时候不打印,而是压栈,从收集栈里面出来的顺序就是左右头了。
/**
*步骤:
* 1、头节点入栈
* 2、每次从栈中弹出一个节点var
* 3、var放入收集栈。
* 4、先把var的右节点压入栈(如果有的话),在把var左节点压入栈(如果有的话)
* 5、执行步骤二(周而复始)
*/
public static void posTraversalStack(Node head){
System.out.print("pos-order: ");
if(head != null){
Stack<Node> stack1 = new Stack<>();
Stack<Node> stack2 = new Stack<>();//收集栈
stack1.push(head);
while(!stack1.isEmpty()){
head = stack1.pop();
stack2.push(head);
if(head.left != null) stack1.push(head.left);
if(head.right != null) stack1.push(head.right);
}
while (!stack2.isEmpty()){
System.out.print(stack2.pop().value + " ");
}
}
System.out.println();
}
}
宽度优先遍历
/**
* 二叉树的深度优先遍历就是二叉树的先序遍历
*
* @author zrulin
* @create 2022-03-15 21:05
*/
public class 宽度优先遍历 {
//宽度优先遍历用队列
public static void widthTraversal(Node head){
System.out.print("width-order: ");
if(head != null){
Queue<Node> queue = new LinkedList<>();
queue.add(head);
while(!queue.isEmpty()){
head = queue.poll();
System.out.println(head.value + "");
if(head.left != null) queue.add(head.left);
if(head.right != null) queue.add(head.right);
}
}
System.out.println();
}
}
这次分享可以说是一个笔记,可以去看视频哦:左神讲算法