力扣【二叉树专题】👊 226. 翻转二叉树

818 阅读2分钟

「这是我参与2022首次更文挑战的第 14 天,活动详情查看:2022首次更文挑战

题目链接

226. 翻转二叉树 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

测试用例

示例 1:

image.png

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

image.png

输入:root = [2,1,3]
输出:[2,3,1]

条件限制

  • 树中节点数目范围在 [0, 100] 内
  • 100 <= Node.val <= 100

题目分析

题目需要我们翻转二叉数,仔细阅读他的示例,发现他的这个翻转效果为,一个节点下的左右子节点互换位置。那么,这题的解法就是,需要我们遍历他的每一个节点,如果这个节点存在子节点,就去交换他的左右子节点,交换完成后,再对这个节点的子节点做同样的操作。这种解题,最合适的就是,使用递归

我们定义一个函数 changeChild(node),判断传入的 node 非空时,再次判断这个 node 存在左子节点或右子节点(或者都存在),然后引入一个中间变量来交互他的子节点(若其中一个节点为空也不会有影响),最后再对这个节点的左右子节点调用 changeChild(就算其中存在空的子节点,也会在开头判断处理好这种情况)

最后我们调用这个函数,传入 root 作为参数,通过递归的方式交互 root 的子节点以及子节点的子节点,因为我们是在 root 上进行的操作,最后直接返回 root 即可

代码实现

var invertTree = function(root) {
    changeChild(root);
    return root;
    function changeChild(root) {
        if (root == null || (root.left == null && root.right == null)) return;
        let temp = root.left;
        root.left = root.right;
        root.right = temp;
        changeChild(root.left);
        changeChild(root.right);
    }
};

image.png

当我们捋清楚二叉树的结构以及递归的使用方式,就能很轻易的解决这题