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)
  • 相关阅读:
    php RSA加密传输代码示例
    数据库执行语句时,严重注意类型转换的问题
    数据库sql的in操作,解决in的过多
    php利用自定义key,对数据加解密的方法
    修改目录下所有文件的某段内容
    ajax返回json时,js获取类型,是字符串类型
    浅析单点登录,以及不同二级域名下的SSO实现
    samba服务,连接远程开发机
    『转』统计一个日志文件里,单词出现频率的shell脚本
    python的装饰器
  • 原文地址:https://www.cnblogs.com/flix/p/12838997.html
Copyright © 2011-2022 走看看