日新刷题 - 226. 翻转二叉树

69 阅读1分钟

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

一、题目描述:

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

给你一棵二叉树的根节点 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

二、思路分析:

观察发现,要翻装一棵二叉树,要将它的左子树和右子树翻转,即先处理孩子结点,再处理根结点,这符合后序遍历的思想。因此选用后序遍历完成算法,但是要注意:翻转不仅仅是交换值,而是要交换位置。(开始没注意还苦恼了很久...)

三、AC 代码:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //后序遍历
        if (root == nullptr)    return nullptr;
        root->left = invertTree(root->left);
        root->right = invertTree(root->right);
        //交换
        TreeNode* tmp = root->left;
        root->left = root->right;
        root->right = tmp;
        return root;
    }
};

四、总结:

我认为递归其实就是在重复做着某件事,比如本题的重复事件就是交换根节点的左右子树;交换完根节点的左右子树后,递归处理左右子树,下一层递归时,仍旧做着同样的事情,只不过下一层的根节点就是上一层的左子树根节点或者右子树根节点。

  1. 明确二叉树每个节点需要做的事情,本题是交换每个节点的左右子节点
  2. 定义一个临时变量用来做交换的操作
  3. 然后递归每一节点的子节点

四、参考:

java 没想到时间空间都这么低!执行用时: 0 ms , 在所有 Java 提交中击败了 100.00% 的用户 内存消耗: 35.6 MB , 在所有 Java 提交中击败了 94.16% 的用户 - 翻转二叉树 - 力扣(LeetCode)