js题解算法(第二十一天)----226.反转二叉树和101. 对称二叉树

169 阅读4分钟

「这是我参与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]

image.png

思路

第一步:从题目中提取关键字

  • 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);
}

总结

像对称二叉树这种题目,想知道后序的内容怎么写,先把第一层的节点写出来,后面的就很好写了

参考