「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
前言
我们做题的时候总会使用一些方法,我们一定要记住,我们掌握的是方法,而不是题目
今天要说的方法是---递归
递归一直被誉为"一看就会,一写就废"的方法,所以我觉得递归不是那么好掌握的
掌握递归一定要掌握两个要点
- 1.结束条件
- 2.自我调用
例如遍历二叉树
const traverse=function(TreeNode* root) {
// 结束条件
if (!root) return root;
// 调用自身
traverse(roo.left);
traverse(root.right);
}
递归可以让我们的代码变得和简洁
递归用到了什么数学方法呢?
归纳法,就是比如我们做数学题的时候,有时候想总结出一定的规律,总是先找几个数试一试,然后再多找一些数字试一试,然后公式就出来了,发现他会适用所有的值,那我们用递归的时候,如果一时间没有思路,那么就可以适用这种方法,先找几个数试一试,在多用几个数试一试,慢慢的就能总结出来,不要总想着一口气写出来,都有过程的,慢慢来
归纳以后,我们在整理出来结束条件和自我调用,这不就万事大吉,天下太平了么
题目
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
思路
第一步:从题目中提取关键字
- 1.注意防止空节点
- 2.所谓的反转其实就是交换,把左侧的节点和右侧的交换,交换的函数大家都会写吧
第二步:分析 所以我们的步骤是
1.只要是二叉树的题目都要遍历,基本上都要使用递归,所以我们可以先写出框架,不要想着一下子把答案写出来,一步一步来
var invertTree = function(root) {
// 防止空节点
if(!root){
return root;
}
// 递归遍历,自己调用自己
invertTree(root.left);
invertTree(root.right);
};
然后写一个交换函数,这个大家都会写,不会写的面壁思考一下
// 交换
let temp = root.left;
root.left = root.right;
root.right = temp;
是的,这道题就需要这两步,主要还是在脑子里先过一遍思路
题解
var invertTree = function(root) {
// 防止空节点
if(!root){ return root; }
// 交换
let temp = root.left;
root.left = root.right;
root.right = temp;
// 递归遍历
invertTree(root.left);
invertTree(root.right);
return root;
};
我们再来一道题目
题目
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入: root = [1,2,2,3,4,4,3]
输出: true
思路
分析
- 1.首先可以确定的是,我们要用两颗树做对比,用一颗树对比一会儿就晕菜了
- 2.如果两颗树都只有一个节点,如果判断是对称的?
-
两个树都为空
-
两棵树都不为空并且值相等
-
const isSameNode = function(root,oroot){
// 树的第一步,必须是这个,判断是否为空
if(!root&&!oroot){
return true;
}
// 如果只有一个为空,那么是不对称的
if(!root||!oroot){
return false;
}
return root.val===oroot.val;
}
- 3.如果两棵树都有两层,都是完全二叉树,如果判断是对称的?
-
除了中间的树要向上面判断以外
-
第一棵的左节点等于第二棵树的右节点,这不就是判断一个节点么是否相等么,需要重复上面的内容
-
第一棵树的右节点等于第二棵树的左节点,这也是判断一个节点是否相等,需要重复上面的内容,
-
const isSameNode = function(root,oroot){
// 树的第一步,必须是这个,判断是否为空
if(!root&&!oroot){
return true;
}
// 如果只有一个为空,那么是不对称的
if(!root||!oroot){
return false;
}
return root.val===oroot.val;
}
题解
const isSameNode = function(root,oroot){
// 两个树判断为空的时候,要判断两种情况,一种是两个树都为空的时候,一种是只有一个树为空的时候
if(!root&&!oroot){
return true;
}
if(!root||!oroot){
return false;
}
// 对称条件
return root.val===oroot.val&&isSameNode(root.left,oroot.right)&&isSameNode(root.right,oroot.left);
}
总结
像对称二叉树这种题目,想知道后序的内容怎么写,先把第一层的节点写出来,后面的就很好写了