zoukankan      html  css  js  c++  java
  • 【LeetCode-树】翻转二叉树(二叉树的镜像)

    题目描述

    翻转一棵二叉树。
    示例:

    输入:
         4
       /   
      2     7
     /    / 
    1   3 6   9
    
    输出:
         4
       /   
      7     2
     /    / 
    9   6 3   1
    

    题目链接: https://leetcode-cn.com/problems/invert-binary-tree/

    思路1

    二叉树的翻转就是将树中所有节点的左右孩子互换。可以使用递归做,也可以使用迭代来做。
    写法一
    使用递归,代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* invertTree(TreeNode* root) {
            if(root==nullptr) return nullptr;
    
            TreeNode* temp = nullptr;
            temp = root->left;
            root->left = root->right;
            root->right = temp;
            invertTree(root->left);
            invertTree(root->right);
            return root;
        }
    };
    

    或者这样写(虽然基本没有差别):

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* invertTree(TreeNode* root) {
            if(root==nullptr) return nullptr;
            if(root->left==nullptr && root->right==nullptr) return root;
    
            swap(root->left, root->right);
            root->left = invertTree(root->left);
            root->right = invertTree(root->right);
            return root;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(h)

    思路2

    使用 bfs 进行迭代,入队的时候将对头节点的左右孩子互换之后入队即可(bfs中不用互换)。代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* invertTree(TreeNode* root) {
            if(root==nullptr) return root;
    
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                TreeNode* curNode = q.front(); q.pop();
                swap(curNode->left, curNode->right);
                if(curNode->left!=nullptr) q.push(curNode->left);
                if(curNode->right!=nullptr) q.push(curNode->right);
            }
            return root;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(n)
  • 相关阅读:
    shell的执行顺序问题
    七层负载均衡——HAProxy
    不要自以为是码农
    SSL协议运行机制
    Linux启动流程
    MIM协议与Base64编码
    Adele的生活
    你值得拥有:25个Linux性能监控工具
    [Zabbix] 如何实现邮件报警通知以及免费短信报警通知
    php.ini中date.timezone设置分析
  • 原文地址:https://www.cnblogs.com/flix/p/12838997.html
Copyright © 2011-2022 走看看