• 【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)
  • 相关阅读:
    select、poll、epoll之间的区别总结[整理]
    IO多路复用之epoll总结
    IO多路复用之select总结
    recv send 阻塞和非阻塞
    undefined reference to `pthread_create' collect2: ld returned 1 exit status
    网络编程 recv()函数
    strlen("汉字")的值是多少
    PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯
    poj1651 Multiplication Puzzle
    poj2240 Arbitrage
  • 原文地址:https://www.cnblogs.com/flix/p/12838997.html
Copyright © 2020-2023  润新知