[更文刷题] 226. 翻转二叉树

95 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

一、题目描述:

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]

示例 3:

输入:root = []
输出:[]

提示:

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

二、思路分析:

  • 两种思路,一种是递归,一种是遍历
  • 对于遍历思维
    • 使用 traverse 函数,在遍历每一个节点时,让左右子树做交换即可。
    • 交换的位置:可以在前中后序均可。但是需要注意的是,在中序遍历位置时,要注意左子树换到了右子树的位置上,这时候再对右子树进行翻转,就相当于对原来的左子树进行第二次反转了。
  • 对于分解问题思想
    • 那么 invertTree 函数的定义是将以 root 为根的这棵二叉树翻转,返回翻转后的二叉树的根节点
    • 在递归调用后,要对函数节点进行翻转。

三、AC 代码:

/**
 * 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 TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        traverse(root);
        return root;
    }

    public void traverse(TreeNode root) {
        if (root == null) {
            return;
        }

        // 在前序遍历位置翻转
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        traverse(root.left);
        traverse(root.right);
        // // 在后序遍历位置进行翻转
        // TreeNode temp = root.left;
        // root.left = root.right;
        // root.right = temp;
    }
}
class Solution {
    public TreeNode invertTree(TreeNode root) {
        // base case
        if (root == null) {
            return null;
        }
        // 递归调用
        TreeNode leftTree = invertTree(root.left);
        TreeNode rightTree = invertTree(root.right);
        // 当前节点进行翻转
        root.left = rightTree;
        root.right = leftTree;

        return root;
    }
}

四、参考:

「手画图解」剖析Howell大神没写出的面试题 | 翻转二叉树 - 翻转二叉树 - 力扣(LeetCode)