翻转二叉树

举报
Linux猿 发表于 2022/02/21 22:04:07 2022/02/21
【摘要】 CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


一、题目描述

给定一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

提示:

树中节点数目范围在 [0, 100] 内

-100 <= Node.val <= 100

二、测试样例

图1 测试样例

输入:root = [4,2,7,1,3,6,9]

输出:[4,7,2,9,6,3,1]

图1中,二叉树经过翻转,左右子树,以及左右子树的子树都翻转了。

三、算法思路

本题是将二叉树整棵树翻转过来,那么,根据二叉树的性质,我们可以使用深度优先搜索算法,不断递归的翻转二叉树,这样就可以将整棵二叉树翻转。

四、代码实现

#include <iostream>

using namespace std;


struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 };

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(!root) return root;
        TreeNode* left = invertTree(root->left); //翻转左子树
        TreeNode* right = invertTree(root->right); //翻转右子树
        root->left = right;
        root->right = left;
        return root;
    }
};

//创建二叉树
TreeNode* createBinaryTree() {
    TreeNode* root = new(TreeNode);
    TreeNode* p1 = new(TreeNode);
    TreeNode* p2 = new(TreeNode);
    TreeNode* p3 = new(TreeNode);
    TreeNode* p4 = new(TreeNode);
    TreeNode* p5 = new(TreeNode);
    TreeNode* p6 = new(TreeNode);

    root->left = p1;
    root->right = p2;
    root->val = 4;

    p1->left = p3;
    p1->right = p4;
    p1->val = 2;

    p2->left = p5;
    p2->right = p6;
    p2->val = 7;

    p3->left = nullptr;
    p3->right = nullptr;
    p3->val = 1;

    p4->left = nullptr;
    p4->right = nullptr;
    p4->val = 3;

    p5->left = nullptr;
    p5->right = nullptr;
    p5->val = 6;

    p6->left = nullptr;
    p6->right = nullptr;
    p6->val = 9;
    return root;
}

//先序遍历二叉树
void print(TreeNode* root) {
    if(!root) return;
    cout<<root->val<<" ";
    print(root->left);
    print(root->right);
}

int main()
{
    Solution obj;
    TreeNode* root = createBinaryTree();
    obj.invertTree(root);
    print(root);
    cout<<endl;
    return 0;
}

五、复杂度分析

5.1 时间复杂度

时间复杂度:O(n),其中,n 为二叉树结点的个数,在上述算法中,每个结点访问一次,所以时间复杂度为 O(n)。

5.2 空间复杂度

空间复杂度:O(n),在上述算法中,使用的是深度优先算法递归访问二叉树,递归是需要消耗空间的,所以空间复杂度为 O(n)。

六、总结

本题主要是理解二叉树的构造,也要掌握深度优先算法。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。