递归三部曲:
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑
二叉树的前序遍历(递归版)-leetcode 144
题目描述:
给你二叉树的根节点 root ,返回它节点值的 前序遍历。
示例一:
输入: root = [1,null,2,3]
输出: [1,2,3]
示例 2:
输入: root = []
输出: []
示例 3:
输入: root = [1]
输出: [1]
示例 4:
输入: root = [1,2]
输出: [1,2]
示例 5:
输入: root = [1,null,2]
输出: [1,2]
思路
- 确定递归函数的传参:当前节点,存储最终结果的数组
- 确定终止递归的条件:当节点为null时,终止递归
- 确定递归的逻辑:这里我们要做的是:
前序遍历,前序遍历的顺序是:中左右,所以我们递归的逻辑为:先将当前节点的值放入结果数组中,再递归左子树,最后递归右子树。
代码
var preorderTraversal = function(root) {
//定义结果数组
let result=[];
//获取结果
getNode(root,result);
// 返回结果
return result;
};
//递归函数
function getNode(cur,result=[]){
// 如果当前节点为null,结束递归
if(cur==null){
return;
}
// 前序遍历:中左右
//先将当前节点的值放入数组中
result.push(cur.val);
//递归查询左子树
getNode(cur.left,result);
//递归查询右子树
getNode(cur.right,result);
}
结果
二叉树的中序遍历(递归版)-leetcode 94
题目描述
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例一:
输入: root = [1,null,2,3]
输出: [1,3,2]
**示例二 **
输入: root = []
输出: []
示例 3:
输入: root = [1]
输出: [1]
思路
- 确定递归函数的传参:当前节点,存储最终结果的数组
- 确定终止递归的条件:当节点为null时,终止递归
- 确定递归的逻辑:这里我们要做的是:
中序遍历,中序遍历的顺序是:左中右,所以我们递归的逻辑为:先递归左子树,再将当前节点的值放入结果数组中,最后递归右子树。
代码
var inorderTraversal = function(root) {
// 存放结果的数组
let result=[];
// 递归获取数组
getNode(root,result);
//返回数组
return result;
};
// 递归方法
function getNode(cur,result){
if(cur==null){
return;
}
// 递归顺序为:左中右
getNode(cur.left,result);
result.push(cur.val);
getNode(cur.right,result);
}
结果
二叉树的后序遍历(递归版)-leetcode 145
题目描述
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
示例 1
输入: root = [1,null,2,3]
输出: [3,2,1]
示例2:
输入: root = []
输出: []
示例3:
输入: root = [1]
输出: [1]
思路
- 确定递归函数的传参:当前节点,存储最终结果的数组
- 确定终止递归的条件:当节点为null时,终止递归
- 确定递归的逻辑:这里我们要做的是:
后序遍历,后序遍历的顺序是:左右中,所以我们递归的逻辑为:先递归左子树,再递归右子树,最后将当前节点的值放入结果数组中。
代码
var postorderTraversal = function(root) {
//存放结果的数组
let result=[];
// 递归获取结果
getNode(root,result);
// 返回结果
return result;
};
// 递归方法
function getNode(cur,result){
// 如果cur 为null,return
if(cur==null){
return;
}
// 按照左右中的顺序遍历
getNode(cur.left,result);
getNode(cur.right,result);
result.push(cur.val);
}
结果
总结
二叉树的递归遍历,要明白三点:
- 递归函数的传参和返回值是什么?
- 递归的终止条件是什么?
- 递归的逻辑是什么?
明白这三点,再做递归的题目,便不会再害怕了。