熟读力扣300题,不会写题也会敲。
二叉树的题目非常之多,人生是有限的,题目是无限的。
二叉树的遍历
先序(根、左、右)、中序(左、根、右)、后序(左、右、根)
递归的方式很简单。
//先序遍历
public static void preOrderTraveral(TreeNode root){
if(root == null)
return;
System.out.println(root.val);
preOrderTraveral(root.left);
preOrderTraveral(root.right);
}
//中序遍历
public static void inOrderTraveral(TreeNode root){
if(root == null)
return;
preOrderTraveral(root.left);
System.out.println(root.val);
preOrderTraveral(root.right);
}
//后序遍历
public static void postOrderTraveral(TreeNode root){
if(root == null)
return;
preOrderTraveral(root.left);
preOrderTraveral(root.right);
System.out.println(root.val);
}
非递归有没有像递归那样的模板呢?
先序遍历的顺序是当前根、左、右,那么进栈的顺序就是右,左,根
先序遍历
//先序遍历的顺序是当前根、左、右,那么进栈的顺序就是右,左,根
public static void preOrderTraveral1(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()){
TreeNode temp = stack.pop();
if(temp!=null){
//先序遍历的顺序是当前根、左、右,那么进栈的顺序就是右,左,根
if(temp.right!=null)
stack.add(temp.right);
if(temp.left!=null)
stack.add(temp.left);
stack.add(temp);
stack.add(null);//用null值标记当前节点,如果遇到null,那下一个节点就是要输出的
}
else {
TreeNode node = stack.pop();
System.out.println(node.val);
}
}
}
中序遍历
public static void inOrderTraveral(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()){
TreeNode temp = stack.pop();
if(temp!=null){
//中序遍历的顺序是左、根、右,那么进栈的顺序就是右,根,根】左
if(temp.right!=null)
stack.add(temp.right);
stack.add(temp);
stack.add(null);//用null值标记当前节点,如果遇到null,那下一个节点就是要输出的
if(temp.left!=null)
stack.add(temp.left);
}
else {
TreeNode node = stack.pop();
System.out.println(node.val);
}
}
}
后序遍历
public static void postOrderTraveral(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()){
TreeNode temp = stack.pop();
if(temp!=null){
//先序遍历的顺序是左、右,根,那么进栈的顺序就是根,右,左
stack.add(temp);
stack.add(null);//用null值标记当前节点,如果遇到null,那下一个节点就是要输出的
if(temp.right!=null)
stack.add(temp.right);
if(temp.left!=null)
stack.add(temp.left);
}
else {
TreeNode node = stack.pop();
System.out.println(node.val);
}
}
}
二叉树非递归遍历可以同一模板了,只要改一下进栈的顺序。
层次遍历,比较简单,直接上菜了。
public static void levelOrderTraveal(TreeNode root){
if(root==null)
return;
Queue<TreeNode> que = new ArrayDeque<>();
que.add(root);
while (!que.isEmpty()){
int size = que.size();
while (size-->0){
TreeNode temp = que.poll();
System.out.println(temp.val);
if (temp.left!=null)
que.add(temp.left);
if(temp.right!=null)
que.add(temp.right);
}
}
}