题目
94. 二叉树的中序遍历
145. 二叉树的后序遍历
144. 二叉树的前序遍历
二叉树的递归遍历,首先要搞清楚两个概念 :
- 二叉树数遍历
- 递归
二叉树遍历
题目中提到的前序遍历、中序遍历、后续遍历
本质上就是中间元素所在的位置
- 前序遍历:中左右
- 中序遍历:左中右
- 后序遍历:左右中
例子:
递归
递归的实现原理是用栈,在遇到递归的问题的时候先不要用自己的脑袋去递归,除非你确定自己有足够的深度
解决递归问题有三个关键的步骤
- 确定最小问题:比如二叉树,当着这棵树只有三个节点的时候,数深为2,你如何实现前序、中序、后续遍历呢,是不是很简单就实现了;
- 确定递归的终止条件:只要是递归,就一定有终止条件,都则就会栈溢出
- 确定递归函数的入参和返回:确定那些参数是递归过程中需要处理的,那么就在递归函数里加上这个参数,还要明确每次递归函数值返回是什么,从而确定返回类型
代码实现
- 二叉树前序遍历 (中左右)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result =new ArrayList<>();
preorder(root,result);
return result;
}
/**
* 中左右
*/
private void preorder(TreeNode root,List<Integer> result ){
if(root == null){
return;
}
result.add(root.val);
preorder(root.left,result);
preorder(root.right,result);
}
}
- 二叉树中序遍历(左中右)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result =new ArrayList<>();
inorder(root,result);
return result;
}
/**
* 中序遍历 左中右
*/
private void inorder(TreeNode root , List<Integer> result){
if(root == null){
return;
}
inorder(root.left,result);
result.add(root.val);
inorder(root.right,result);
}
}
二叉树后序遍历(左右中)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result =new ArrayList<>();
postorder(root,result);
return result;
}
/**
* 后续 左右中
*/
private void postorder(TreeNode root,List<Integer> result ){
if(root ==null ){
return;
}
postorder(root.left,result);
postorder(root.right,result);
result.add(root.val);
}
}