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)
  • 相关阅读:
    putty设置用key自动登录
    linux快速进入全屏命令行模式
    二维数组的指针
    vim编写Bash脚本
    使用cat命令添加或附加多行文本
    Linode中的Network Helper
    网络通信框架之retrofit
    网络通信框架之okHttp
    网络通信框架之okHttpUtils
    Volley源码分析
  • 原文地址:https://www.cnblogs.com/flix/p/12838997.html
Copyright © 2011-2022 走看看