• 力扣周赛 313 反转二叉树的奇数层(dfs镜像遍历 or bfs提取层节点)


    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    题意:

    对于一颗给定的二叉树,我们的任务是反转它的所有奇数层的节点的权值 val(根节点所在层为第 0 层),操作完后返回根节点 root。

    思路:

    思路一:

    dfs 镜像遍历:左子树按照左中右的顺序遍历 右子树按照右中左的顺序遍历

    当遍历到 奇数层 的时候,根据镜像遍历的特点,可以发现:当前遍历的两个点就是需要对换的两个点,直接对换即可。

    思路二:

    bfs 提取遍历过程中的 各层的节点,如果当前层是 奇数层,则反转节点权值即可。

    思路二的实现较为巧妙,具体可以参考我之前写的一篇关于 bfs 求二叉树宽度 的博客:二叉树专题–洛谷 P3884 [JLOI2009]二叉树问题

    由于我们只关注层数的奇偶性,因此我们只需设置一个只有 0、1 两种取值的变量 dep,如果为 0 表示偶数层,为 1 表示奇数层,

    当奇偶性改变的时候,对变量 dep 异或一个 1 即可。

    时间复杂度:

    O ( n ) O(n) O(n)

    代码:

    代码一:dfs(很短)

    /**
     * Definition for a binary tree node.
     * 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:
        void dfs(tn* a, tn* b, int dep)
        {
            if(!a) return ;
            if(dep) swap(a->val, b->val);
            dfs(a->le, b->ri, dep ^ 1), dfs(a->ri, b->le, dep ^ 1);
        }
    
        TreeNode* reverseOddLevels(TreeNode* root) {
            dfs(root->le, root->ri, 1);
            return root;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    代码二:bfs(较长)

    /**
     * Definition for a binary tree node.
     * 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:
        tn* bfs(tn* u)
        {
            qu<tn*> q; q.push(u), q.push(npt);
            vc<tn*> level;
            int dep = 0;
            while(!q.EP())      
            {
                auto tt = q.FT(); q.pop();
                if(!tt)
                {
                    if(level.EP()) break;
                    if(dep)
                    {
                        for(int i = 0, j = level.SZ() - 1; i < j; ++i, --j) 
                            swap(level[i]->val, level[j]->val);
                    }
                    dep ^= 1;
                    q.push(npt);
                    level.clear();
                    continue;
                }
                level.pb(tt);
                if(tt->left) q.push(tt->le), q.push(tt->ri);
            }
            return u;
        }
    
        TreeNode* reverseOddLevels(TreeNode* root) {
            return bfs(root);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    宏定义代码:

    typedef pair<int, int> pii;
    typedef long long ll;
    typedef double db;
    #define x first
    #define y second
    #define tn TreeNode
    #define npt nullptr
    #define le left
    #define ri right
    #define qu queue
    #define dq deque
    #define vc vector
    #define pq priority_queue
    #define umap unordered_map
    #define uset unordered_set
    #define EP() empty()
    #define SZ() size()
    #define FT() front()
    #define pb push_back
    #define pf push_front
    #define pp pop_back
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    【Linux】Linux环境搭建
    姑苏寻韵~庆开放原子开源大赛 OpenTiny 前端 Web 应用开发挑战赛路演圆满落幕。
    【牛客网】递归/回溯
    【【VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 】】
    VSCode Java 开发配置
    Linux内存管理(二十):LRU简介
    LeetCode —— 回溯
    Dell戴尔笔记本外星人Alienware x15 R2原装出厂Windows11系统21H2
    C++ 运算符重载
    深度学习之基于Django+Tensorflow动物识别系统
  • 原文地址:https://blog.csdn.net/Jacob0824/article/details/127553931