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)

相关推荐
Old Uncle Tom5 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆5 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移5 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业6 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
智者知已应修善业8 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
.5489 小时前
## Sorting(排序算法)
python·算法·排序算法
wuweijianlove9 小时前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊9 小时前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
code_pgf10 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
嘻嘻哈哈樱桃11 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划