leetcode:226. 翻转二叉树

题目

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:
[简单] 226. 翻转二叉树 - 图1

  1. 输入:root = [4,2,7,1,3,6,9]
  2. 输出:[4,7,2,9,6,3,1]

示例 2:
[简单] 226. 翻转二叉树 - 图2

  1. 输入:root = [2,1,3]
  2. 输出:[2,3,1]

示例 3:

  1. 输入:root = []
  2. 输出:[]

解答 & 代码

解法一:DFS 递归

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. TreeNode* invertTree(TreeNode* root) {
  15. if(root == nullptr)
  16. return nullptr;
  17. // 递归处理左右子树
  18. TreeNode* inverseLeft = invertTree(root->left);
  19. TreeNode* inverseRight = invertTree(root->right);
  20. // 翻转当前节点的左、右节点
  21. root->left = inverseRight;
  22. root->right = inverseLeft;
  23. return root;
  24. }
  25. };

复杂度分析:设二叉树共 N 个节点

  • 时间复杂度 O(N):遍历每个节点一次
  • 空间复杂度 O(log N):栈空间取决于递归深度,即二叉树的高度

执行结果:

  1. 执行结果:通过
  2. 执行用时:4 ms, 在所有 C++ 提交中击败了 46.08% 的用户
  3. 内存消耗:9.4 MB, 在所有 C++ 提交中击败了 73.28% 的用户

解法二:BFS

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. TreeNode* invertTree(TreeNode* root) {
  15. // 一定不能忘了先处理特殊情况!!!!!!!!
  16. if(root == nullptr)
  17. return nullptr;
  18. queue<TreeNode*> nodeQ;
  19. nodeQ.push(root);
  20. while(!nodeQ.empty())
  21. {
  22. TreeNode* cur = nodeQ.front();
  23. nodeQ.pop();
  24. // 将当前节点的左、右节点进行翻转
  25. TreeNode* tempLeft = cur->left;
  26. cur->left = cur->right;
  27. cur->right = tempLeft;
  28. // 左、右节点入队列
  29. if(cur->left != nullptr)
  30. nodeQ.push(cur->left);
  31. if(cur->right != nullptr)
  32. nodeQ.push(cur->right);
  33. }
  34. return root;
  35. }
  36. };

复杂度分析:设二叉树共 N 个节点

  • 时间复杂度 O(N):遍历每个节点一次
  • 空间复杂度 O(N):队列 nodeQ 中存储的节点个数不会超过 N
  1. 执行结果:通过
  2. 执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户
  3. 内存消耗:9.5 MB, 在所有 C++ 提交中击败了 42.23% 的用户