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)

相关推荐
Frostnova丶1 小时前
(10)LeetCode 560. 和为K的子数组
算法·leetcode·哈希算法
AI专业测评1 小时前
2026年AI写作软件底层技术全景解析:长篇AI写网文的工程化实践与AI消痕算法基准测试
人工智能·算法·ai写作
2401_884563241 小时前
高性能日志库C++实现
开发语言·c++·算法
handler011 小时前
基础算法:BFS
开发语言·数据结构·c++·学习·算法·宽度优先
2401_879503411 小时前
C++中的状态模式实战
开发语言·c++·算法
不当菜鸡的程序媛1 小时前
神经网络——bias 偏置项(bias term) 或者截距项(intercept term)
人工智能·神经网络·算法
Aawy1201 小时前
自定义字面量实战
开发语言·c++·算法
无尽的罚坐人生1 小时前
hot 100 200. 岛屿数量
算法·dfs
j_xxx404_2 小时前
LeetCode模拟算法精解II:外观数列与数青蛙
数据结构·c++·算法·leetcode