【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)
posted @ 2020-05-06 21:25  Flix  阅读(376)  评论(0编辑  收藏  举报