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)

相关推荐
To_OC9 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎10 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC11 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn12 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹12 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术12 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
CV-Climber15 小时前
检索技术的实际应用
人工智能·算法
hhzz15 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
从零开始的代码生活_16 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法