题目描述:
题号:226
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
解题思路:
思路一:深度优先搜索 + 递归
-
递归结束条件:如果当前节点为空或者没有子节点(左右子节点都为空),则直接返回该节点,因为没有需要翻转的子树。
-
递归操作:
a. 递归调用函数处理当前节点的左子树,得到翻转后的左子树根节点。
b. 递归调用函数处理当前节点的右子树,得到翻转后的右子树根节点。
c. 交换当前节点的左右子节点。
时间复杂度:O(N)
空间复杂度:O(N)
C++
// C++
/**
* 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 == nullptr || (root->right == nullptr && root->left == nullptr)) {
return root;
}
function<TreeNode*(TreeNode*)> fan = [&] (TreeNode* root) -> TreeNode*
{
//递归结束条件
if(root == nullptr || (root->right == nullptr && root->left == nullptr)){
return root;
}
//递归操作
TreeNode* left = fan(root->left);
TreeNode* right = fan(root->right);
root->left = right;
root->right = left;
return root;
};
return fan(root);
}
};
go
// go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// 可以不用匿名函数
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
newLeft := invertTree(root.Left)
newRight := invertTree(root.Right)
root.Left = newRight
root.Right = newLeft
return root
}