hot100——226.翻转二叉树

在解答本题之前,我们需要先了解一下递归:

递归

以求二叉树的最大深度举例:

正如灵茶山艾府大佬所言,我们不能一开始就陷入在细节里面,就如同下图所言:

其中加1是把当前节点给加上。

而每个子树中又是和上图一样的分析方法:

这时候到达了边界条件之后,便是从底往上归,开始是从上往底递。

以此例进行讲解:

root==3,root->left==9.root->right==20;

left = maxDepth(9);

进入第二层MaxDepth,此时的root为9,root->left ==NULL,root->right==NULL;

进入第三层MaxDepth,此时的root为NULL,返回0,

所以第二层的left的结果为0,执行right

root->right==NULL,所以right==0;return max(0,0)+1 = 1,返回1;

返回第一层MaxDepth,left = 1;

进入right,root->right == 20;

进入第二层MaxDepth,此时root==20;root->left == 15, root- >right == 7

执行left,进入第三层MaxDepth,此时root==15,root->left == NULL,root->right == NULL;

执行left,进入第四层MaxDepth,此时root==NULL,返回0,所以第三层left == 0;

执行right,进入第四层MaxDepth,此时root==NULL,返回0,所以第三层的right == 0;

返回1,所以第三层MaxDepth的结果是1;

返回第二层MaxDepth,此时left == 1;

执行right,此时root->right == 7,后续与上述同理,返回1;

返回第二层MaxDepth,right == 1;

返回max(1,1)+1 = 2;

返回第一层MaxDepth,此时的right == 2,

最终的结果是max(1,2)+1 == 3;

所以最终的二叉树的最大深度是3。

代码

C++
cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL)
            return 0;
        auto left = maxDepth(root->left);
        auto right = maxDepth(root->right);
        return max(left,right) + 1;
    }
};
python
python 复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: int
        """
        if root is None:
            return 0
        left = self.maxDepth(root.left)
        right = self.maxDepth(root.right)
        return max(left,right)+1

本题解法

本题中要求得到翻转二叉树,除去根节点,其余所有节点都要左右反转,也即:

根节点的左右儿子需要反转,左儿子变成右儿子,右儿子变成左儿子,这可以看作是原问题

同时左右子树也需要进行翻转,和根节点的反转一样,这是子问题,与原问题类似,因此需要用到上述的递归思想。

边界条件,当访问到root为NULL时,返回NULL;

因此我们递归调用root->left,获取左子树翻转之后的结果left;

同时递归调用root->right,获取右子树翻转之后的结果right;

之后交换root的左右子树的结果,root->left = right;root->right =left;返回最终的root即可。

代码

C++
cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root == NULL)
            return NULL;
        auto left = invertTree(root->left);
        auto right = invertTree(root->right);
        root->left = right;
        root->right = left;
        return root;
    }
};
python
python 复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def invertTree(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: Optional[TreeNode]
        """
        if root is None:
            return None
        left = self.invertTree(root.left)
        right = self.invertTree(root.right)
        root.left = right
        root.right = left
        return root
        

参考

深入理解递归【基础算法精讲 09】

灵茶山艾府 两种递归写法(Python/Java/C++/C/Go/JS/Rust)

相关推荐
dialect_4 小时前
KMP算法
开发语言·c++·算法
reikocao4 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
漂流瓶jz4 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·5 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
是main不是漫6 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
深圳市快瞳科技有限公司7 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
专注仿真9 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄9 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy9 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
D e re k ZH10 小时前
P5025 [SNOI2017] 炸弹
c++·算法