题源:
144.二叉树的前序遍历
94.二叉树的中序遍历
145.二叉树的后序遍历
第一种方法:递归实现
比较简单,记住三种遍历的顺序即可
//二叉树的前序遍历
public class PreOrderTraversal {
public List<Integer> preOrderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
//递归跳出的条件
if(root==null) {
return list;
}
list.add(root.val);
//递归添加root的左节点
preOrderTraversal(root.left);
//递归添加root的右节点
preOrderTraversal(root.right);
return list;
}
}
package com.algorithm.binarytree;
import java.util.ArrayList;
import java.util.List;
/**
* @program: Java IDEA Projects
* @create: 2022-01-21 14:56
**/
//二叉树的中序遍历
public class InOrderTraversal {
public List<Integer> inOrderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
inOrder(root,list);
return list;
}
//左子树-根结点-右子树
public void inOrder(TreeNode treeNode,List<Integer> list) {
if(treeNode==null) {
return;
}
inOrder(treeNode.left,list);
list.add(treeNode.val);
inOrder(treeNode.right,list);
}
}
package com.algorithm.binarytree;
import java.util.ArrayList;
import java.util.List;
/**
* @program: Java IDEA Projects
* @create: 2022-01-21 15:53
**/
//二叉树的后序遍历
public class PostOrderTraversal {
public List<Integer> postOrderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
postOrder(root,list);
return list;
}
//左子树-右子树-根节点
public void postOrder(TreeNode treeNode,List<Integer> list) {
if(treeNode==null) return;
postOrder(treeNode.left,list);
postOrder(treeNode.right,list);
list.add(treeNode.val);
}
}
第二种方法:迭代实现(栈)
前序遍历
//二叉树前序遍历
public List<Integer> preOrderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
if(root==null) return list;
//模拟栈的结构
Deque<TreeNode> deque=new ArrayDeque<>();
//先将根节点压入栈
deque.push(root);
//非空时迭代
while(!deque.isEmpty()) {
TreeNode temp=deque.pop();
list.add(temp.val);
//判断是否非空
//这里先放右子树是因为栈的先进后出特性
//如果要得到左子树就要先将右子树压入栈
if(temp.right!=null) deque.push(temp.right);
if(temp.left!=null) deque.push(temp.left);
}
return list;
}
中序遍历
引用leetcode题解动态图方便小伙伴们更好理解
//二叉树中序遍历
public List<Integer> inOrderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
if(root==null) return list;
Deque<TreeNode> deque=new ArrayDeque<>();
//这里要嵌套两个条件,因为我们要找到不断找到节点的左子树把它压入栈中
while(!deque.isEmpty() || root!=null) {
while (root!=null) {
//把左节点压入栈中
deque.push(root);
//root等于root左节点
root=root.left;
}
//此时的root是最左边的节点,也就是中序遍历的第一个节点
root=deque.pop();
list.add(root.val);
//把当前子节点的左子树和当前子节点都弹出,再检查root的右节点
//如果右节点为空,就不会进入内嵌循环
root=root.right;
}
return list;
}
后序遍历
//二叉树后序遍历
public List<Integer> postOrderTraversal(TreeNode root) {
//用LinkedList实现将root插到链表头部,即栈底
LinkedList<Integer> list=new LinkedList<>();
if(root == null) return list;
Deque<TreeNode> deque=new ArrayDeque<>();
deque.push(root);
while(!deque.isEmpty()) {
TreeNode temp=deque.pop();
list.addFirst(temp.val);
//和前序遍历相反即可
if(temp.left!=null) deque.push(temp.left);
if(temp.right!=null) deque.push(temp.right);
}
return list;
}