

在解答本题之前,我们需要先了解一下递归:
递归
以求二叉树的最大深度举例:

正如灵茶山艾府大佬所言,我们不能一开始就陷入在细节里面,就如同下图所言:
其中加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
参考