• 力扣第226翻转二叉数 c++三种方法 +注释


    题目

    226. 翻转二叉树

    简单

    给你一棵二叉树的根节点 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

    c++ 代码一 (递归法)

    1. class Solution {
    2. public:
    3. TreeNode* invertTree(TreeNode* root) {
    4. if (root == NULL) return root; // 如果根节点为空,直接返回该节点,不进行翻转操作
    5. swap(root->left, root->right); // 交换当前节点的左右子树,实现翻转操作
    6. invertTree(root->left); // 递归地对当前节点的左子树进行翻转
    7. invertTree(root->right); // 递归地对当前节点的右子树进行翻转
    8. return root; // 返回翻转后的根节点
    9. }
    10. };

    以上是代码中的注释,解释了每一行代码的作用。

    • 如果根节点为空,直接返回根节点,不进行翻转操作。
    • 交换当前节点的左右子树,实现翻转操作。
    • 递归地对当前节点的左子树进行翻转。
    • 递归地对当前节点的右子树进行翻转。
    • 返回翻转后的根节点。

    c++ 代码二 (迭代法(前序遍历))

    1. class Solution {
    2. public:
    3. TreeNode* invertTree(TreeNode* root) {
    4. if (root == NULL) return root; // 如果根节点为空,直接返回该节点,不进行翻转操作
    5. stack st; // 创建一个栈,用于存储待翻转的节点
    6. st.push(root); // 将根节点入栈
    7. while (!st.empty()) {
    8. TreeNode* node = st.top(); // 取出栈顶节点作为当前节点
    9. st.pop();
    10. swap(node->left, node->right); // 交换当前节点的左右子树,实现翻转操作
    11. if (node->right) st.push(node->right); // 如果当前节点的右子树不为空,则将右子树节点入栈,准备进行翻转操作
    12. if (node->left) st.push(node->left); // 如果当前节点的左子树不为空,则将左子树节点入栈,准备进行翻转操作
    13. }
    14. return root; // 返回翻转后的根节点
    15. }
    16. };

    以上是代码中的注释,解释了每一行代码的作用。

    • 如果根节点为空,直接返回根节点,不进行翻转操作。
    • 创建一个栈,用于存储待翻转的节点。
    • 将根节点入栈。
    • 使用迭代法进行翻转操作:
      • 取出栈顶节点作为当前节点。
      • 交换当前节点的左右子树,实现翻转操作。
      • 如果当前节点的右子树不为空,则将右子树节点入栈,准备进行翻转操作。
      • 如果当前节点的左子树不为空,则将左子树节点入栈,准备进行翻转操作。
    • 返回翻转后的根节点。

    c++ 代码三 (广度优先遍历)

    1. class Solution {
    2. public:
    3. TreeNode* invertTree(TreeNode* root) {
    4. queue que; // 创建一个队列,用于存储待翻转的节点
    5. if (root != NULL) que.push(root); // 如果根节点不为空,则将根节点入队列
    6. while (!que.empty()) { // 当队列不为空时循环执行操作
    7. int size = que.size(); // 获取当前队列的大小,即当前层的节点数
    8. for (int i = 0; i < size; i++) { // 遍历当前层的节点
    9. TreeNode* node = que.front(); // 取出队首节点作为当前节点
    10. que.pop(); // 出队列
    11. swap(node->left, node->right); // 交换当前节点的左右子树,实现翻转操作
    12. if (node->left) que.push(node->left); // 如果当前节点的左子树不为空,则将左子树节点入队列,准备进行翻转操作
    13. if (node->right) que.push(node->right); // 如果当前节点的右子树不为空,则将右子树节点入队列,准备进行翻转操作
    14. }
    15. }
    16. return root; // 返回翻转后的根节点
    17. }
    18. };

    以上是代码中的注释,解释了每一行代码的作用。

    • 创建一个队列,用于存储待翻转的节点。
    • 如果根节点不为空,则将根节点入队列。
    • 使用迭代法进行翻转操作:
      • 获取当前队列的大小,即当前层的节点数。
      • 遍历当前层的节点:
        • 取出队首节点作为当前节点。
        • 交换当前节点的左右子树,实现翻转操作。
        • 如果当前节点的左子树不为空,则将左子树节点入队列,准备进行翻转操作。
        • 如果当前节点的右子树不为空,则将右子树节点入队列,准备进行翻转操作。
    • 返回翻转后的根节点。

    觉得有用的话可以点点赞,支持一下。

    如果愿意的话关注一下。会对你有更多的帮助。

    每天都会不定时更新哦  >人<  。

  • 相关阅读:
    Spring是如何整合JUnit的?JUnit源码关联延伸阅读
    ssm/php/node/python农产品销售网站
    微信小程序 picker-view 组件构建一个上下拖动选择器
    Android Kotlin 协程初探
    Linux 权限系统
    Performance of the Dell PowerEdge R750xa Server for MLPerf™ Inference v2.0
    1582. 二进制矩阵中的特殊位置(难度:简单)
    3 Mybatis详解~
    NVIDIA CX 网卡驱动安装 测试
    从局部变量说起,关于一个莫得名堂的引用和一个坑!
  • 原文地址:https://blog.csdn.net/jgk666666/article/details/133589493