二叉树的遍历主要有两种思路:一种是递归,另一种是栈。递归的思想是有二叉树的特点决定的,代码实现很简单,栈就稍微复杂一点。
1.递归实现二叉树的遍历
(1)二叉树的中序遍历
class Solution {
List<Integer> res = new ArrayList<Integer>() ;
public List<Integer> inorderTraversal(TreeNode root) {
inorder(root);
return res;
}
public void inorder(TreeNode root) {
if(root == null){
return ;
}
inorder(root.left);
res.add(root.val); //此行代码的位置直接决定了是那种遍历
inorder(root.right);
}
}
(2)前序遍历
class Solution {
List<Integer> res = new ArrayList<Integer>() ;
public List<Integer> inorderTraversal(TreeNode root) {
inorder(root);
return res;
}
public void inorder(TreeNode root) {
if(root == null){
return ;
}
res.add(root.val); //此行代码的位置直接决定了是那种遍历
inorder(root.left);
inorder(root.right);
}
}
(3)后序遍历
class Solution {
List<Integer> res = new ArrayList<Integer>() ;
public List<Integer> inorderTraversal(TreeNode root) {
inorder(root);
return res;
}
public void inorder(TreeNode root) {
if(root == null){
return ;
}
inorder(root.left);
inorder(root.right);
res.add(root.val); //此行代码的位置直接决定了是那种遍历
}
}
2.栈来实现二叉树的遍历
(1)中序遍历
class Solution {
List<Integer> res = new ArrayList<Integer>();
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
while(true){
while(root != null){
stack.push(root);
root = root.left;
}
if(stack.isEmpty()) {
break;
}
root = stack.pop();
res.add(root.val);
root = root.right;
}
return res;
}
}
(2)前序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root){
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if(root == null) return res;
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
res.add(node.val);
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
}
return res;
}
}
(3)后序遍历
class Solution{
List<Integer> res = new ArrayList<Integer>();
public List<Integer> postorderTraversal(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
while(true){
while(root != null){
stack.push(root);
root = root.right;
}
if(stack.isEmpty()){
break;
}
root = stack.pop();
root = root.left;
res.add(root.val);
}
return res;
}
}