当前位置:   article > 正文

第六章二叉树——翻转二叉树

第六章二叉树——翻转二叉树

吾日三省吾身

还记得梦想吗

正在努力实现它吗

可以坚持下去吗

目录

吾日三省吾身

力扣题号:226. 翻转二叉树 - 力扣(LeetCode)

题目描述

Java解法一:层序遍历+翻转

实现思路

swapTree 方法

注意事项

代码实现

Java

C++

 

Java解法二:递归

实现思路

swap 方法

注意事项

代码实现

Java

 C++

总结


 

 


力扣题号:226. 翻转二叉树 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100] 内
  • -100 <= Node.val <= 100

Java解法一:层序遍历+翻转

实现思路

        该算法通过层序遍历的方式实现二叉树的翻转。在每一层的循环中,弹出一个节点后,通过交换其左右子节点实现翻转。然后将交换后的左右子节点加入队列,继续下一轮层序遍历。

思路如下:

  • 非空判断,若根节点为空,直接返回。
  • 使用队列 deque 来进行层序遍历,将根节点加入队列。
  • 进入循环,每次循环处理一层的节点。
    • 记录当前层的节点数量 size
    • 在内部循环中,弹出队列中的节点,调用 swapTree 方法翻转其左右子节点。
    • 将左右孩子加入队列。
  • 最终返回翻转后的二叉树的根节点。
swapTree 方法

swapTree 方法接收一个树节点作为参数,用于翻转该节点的左右子节点。

注意事项

  • 代码通过队列实现了层序遍历,确保同一层的节点先被处理,实现了翻转的效果。
  • swapTree 方法用于交换一个节点的左右子节点。

代码实现

Java
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode invertTree(TreeNode root) {
  18. // 非空判断
  19. if (root == null){
  20. return root;
  21. }
  22. // 定义一个队列用于实现层序遍历
  23. Deque<TreeNode> deque = new ArrayDeque<>();
  24. // 先将根结点加入
  25. deque.offer(root);
  26. // 层序遍历的流程
  27. while (!deque.isEmpty()){
  28. // 由于size是会改变的,所以我们先记录一下
  29. int size = deque.size();
  30. // 遍历一层
  31. for (int i = 0; i < size; i++) {
  32. // 弹出一个节点
  33. TreeNode node = deque.poll();
  34. // 交换该节点下面的子节点
  35. swapTree(node);
  36. // 层序遍历步骤,将左右孩子加入队列
  37. if (node.left != null){
  38. deque.offer(node.left);
  39. }
  40. if (node.right != null){
  41. deque.offer(node.right);
  42. }
  43. }
  44. }
  45. return root;
  46. }
  47. /**
  48. * 交换node节点的孩子
  49. * @param node 根节点
  50. */
  51. public void swapTree(TreeNode node){
  52. TreeNode temp = node.left;
  53. node.left = node.right;
  54. node.right = temp;
  55. }
  56. }
C++
 
  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 root;
  17. }
  18. std::queue<TreeNode*> que;
  19. que.push(root);
  20. while (!que.empty()) {
  21. int size = que.size();
  22. for (int i = 0; i < size; i++) {
  23. TreeNode* node = que.front();
  24. que.pop();
  25. swapTree(node);
  26. if (node->left != nullptr) {
  27. que.push(node->left);
  28. }
  29. if (node->right != nullptr) {
  30. que.push(node->right);
  31. }
  32. }
  33. }
  34. return root;
  35. }
  36. void swapTree(TreeNode* node) {
  37. TreeNode* temp = node->left;
  38. node->left = node->right;
  39. node->right = temp;
  40. }
  41. };

打败了全世界的人!!!!!!!!!!!!!!!!!!


Java解法二:递归

实现思路

        该算法通过递归的方式实现二叉树的翻转。递归函数中,首先判断当前节点是否为空,如果为空则直接返回 null;否则,递归调用 invertTree 方法翻转左右子树,然后调用 swap 方法翻转当前节点的左右子节点。

思路如下:

  • 非空判断,若根节点为空,直接返回 null
  • 递归调用 invertTree 方法分别对左右子树进行翻转。
  • 调用 swap 方法翻转当前节点的左右子节点。
  • 返回当前节点。
swap 方法

        swap 方法接收一个树节点作为参数,用于翻转该节点的左右子节点。

注意事项

  • 代码通过递归实现了二叉树的翻转,递归函数在处理每个节点时都考虑了左右子树的翻转操作。
  • swap 方法用于交换一个节点的左右子节点。

代码实现

Java
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode invertTree(TreeNode root) {
  18. // 如果是null返回null
  19. if(root == null){
  20. return null;
  21. }
  22. //采用后序遍历,达到交换子节点的目的
  23. invertTree(root.left);
  24. invertTree(root.right);
  25. swap(root);
  26. return root;
  27. }
  28. /**
  29. 交换子节点
  30. */
  31. public void swap(TreeNode node){
  32. TreeNode temp = node.left;
  33. node.left = node.right;
  34. node.right = temp;
  35. }
  36. }
 C++
  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. invertTree(root->left);
  19. invertTree(root->right);
  20. swap(root);
  21. return root;
  22. }
  23. void swap(TreeNode* node) {
  24. TreeNode* temp = node->left;
  25. node->left = node->right;
  26. node->right = temp;
  27. }
  28. };

说实话内存开销都挺大的,但是快呀!!~~~


总结

        一道二叉树翻转的问题,我们提供了两种不同的解法:一种是通过层序遍历的迭代方法,另一种是通过递归方法。

        在迭代方法中,我们使用了队列来进行层序遍历,通过交换每个节点的左右子节点实现翻转。这样确保了同一层的节点先被处理,实现了翻转的效果。在递归方法中,我们采用后序遍历的方式,先递归翻转左右子树,然后再交换当前节点的左右子节点。两种方法都达到了翻转二叉树的效果,但是递归方法在代码上更为简洁。

坚持梦想,努力奋斗!!!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/531253
推荐阅读
相关标签
  

闽ICP备14008679号