首页 > 编程语言 >【教3妹学编程-算法题】反转二叉树的奇数层

【教3妹学编程-算法题】反转二叉树的奇数层

时间:2023-12-16 11:07:54浏览次数:28  
标签:TreeNode val 反转 编程 妹学 二叉树 root 节点

【教3妹学编程-算法题】反转二叉树的奇数层_二叉树

3妹:“你不是真正的快乐, 你的笑只是你穿的保护色”
2哥 : 3妹还在唱五月天的歌啊, 你不知道五月天假唱,现在全网都在骂呢。
3妹:知道啊,可是关我什么事,这个歌的确好听啊。
2哥 : 嗯嗯,不错, 还以为你是脑残粉,无论黑白都只管追星呢。
3妹:我是只管追歌的, 歌好听就行啦。
2哥 : 追哥?追哪个哥, 难道是我这个2哥~
3妹:切,谐音梗扣钱!
2哥:话说五月天演唱会的门票还挺贵的, 要上千了, 粉丝们花了钱如果听的假唱,要伤心了。3妹会花1000块购买演唱会门票吗?
3妹:我不会买, 不过娱乐圈的水很深,孰是孰非很难说的清楚,说不定后面会反转呢。
2哥:这件事会不会反转我不知道,不过我今天倒是看到了一个关于反转的题目,让我们来做一下吧:

【教3妹学编程-算法题】反转二叉树的奇数层_i++_02

 1题目: 

给你一棵 完美 二叉树的根节点 root ,请你反转这棵树中每个 奇数 层的节点值。

例如,假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] ,那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。
反转后,返回树的根节点。

完美 二叉树需满足:二叉树的所有父节点都有两个子节点,且所有叶子节点都在同一层。

节点的 层数 等于该节点到根节点之间的边数。

示例 1:


【教3妹学编程-算法题】反转二叉树的奇数层_二叉树_03


输入:root = [2,3,5,8,13,21,34]
输出:[2,5,3,8,13,21,34]
解释:
这棵树只有一个奇数层。
在第 1 层的节点分别是 3、5 ,反转后为 5、3 。
示例 2:


【教3妹学编程-算法题】反转二叉树的奇数层_i++_04


输入:root = [7,13,11]

输出:[7,11,13]

解释:
在第 1 层的节点分别是 13、11 ,反转后为 11、13 。
示例 3:

输入:root = [0,1,2,0,0,0,0,1,1,1,1,2,2,2,2]
输出:[0,2,1,0,0,0,0,2,2,2,2,1,1,1,1]
解释:奇数层由非零值组成。
在第 1 层的节点分别是 1、2 ,反转后为 2、1 。
在第 3 层的节点分别是 1、1、1、1、2、2、2、2 ,反转后为 2、2、2、2、1、1、1、1 。

提示:

树中的节点数目在范围 [1, 214] 内
0 <= Node.val <= 10^5
root 是一棵 完美 二叉树

 2思路: 

【教3妹学编程-算法题】反转二叉树的奇数层_二叉树_05

广度优先搜索,

我们直接按照层次遍历该二叉树,然后将奇数层中的值进行反转。二叉树按照层次遍历是一个基本的广度优先搜索问题,可以参考「树的层序遍历」。在遍历的同时,对每一层进行标记,如果当前该层为奇数层,则将该层中的节点用数组保存起来,然后将该层所有节点的值进行反转即可。

 1java代码: 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 class Solution {
    public TreeNode reverseOddLevels(TreeNode root) {


        List<TreeNode> list=new ArrayList<>();


        list.add(root);


        int depth=0;
        while(!list.isEmpty()){            
            
            if(depth%2==1){
                List<Integer> temp=new ArrayList<>();


                for(int i=0;i<list.size();i++){
                    temp.add(list.get(i).val);
                }


                for(int i=0;i<list.size();i++){
                    list.get(i).val=temp.get(list.size()-i-1);
                }
            }


            List<TreeNode> l=new ArrayList<>();
            
            for(int i=0;i<list.size();i++){
                TreeNode node=list.get(i);
                if(node.left!=null){
                    l.add(node.left);
                }
                if(node.right!=null){
                    l.add(node.right);
                }
            }
            
            depth++;
            list=l;
        }


        return root;
    }
}

标签:TreeNode,val,反转,编程,妹学,二叉树,root,节点
From: https://blog.51cto.com/u_6813689/8849458

相关文章

  • 商用软件调用开源代码后硬分叉不合并 —— 一种合法的防御性编程或者是商用软件的贪婪
    看到一个说法,说前段时间某滴的公司代码升级导致错误最后使全公司业务崩溃一整天的事情是因为公司商用软件中使用了一种合法的防御性编程,也就是商用软件调用开源代码后硬分叉不合并。 可以说商业企业大幅度使用开源软件已经是公开的秘密了,但是出于实际情况这些不合规的将开源软......
  • 【教3妹学编程-算法题】用邮票贴满网格图
    3妹:“你不是真正的快乐,你的笑只是你穿的保护色”2哥 :3妹还在唱五月天的歌啊,你不知道五月天假唱,现在全网都在骂呢。3妹:知道啊,可是关我什么事,这个歌的确好听啊。2哥 :嗯嗯,不错,还以为你是脑残粉,无论黑白都只管追星呢。3妹:我是只管追歌的,歌好听就行啦。2哥 :追哥?追哪个哥,难......
  • 计算机图形:可编程着色器
    目录OpenGL渲染流水线固定功能流水线可编程功能流水线顶点着色器片元着色器几何着色器曲面细分着色器OpenGL着色语言(GLSL)着色器结构OpenGL中使用着色器基本数据类型矢量矩阵结构、数组控制结构GLSL函数与OpenGL通信OpenGL渲染流水线图形API提供对硬件操作的标准接口,对程序员提......
  • 第六章 二叉树part01
    第六章二叉树**part01**  递归遍历 144.二叉树的前序遍历 Code:/***Definitionforabinarytreenode.*structTreeNode{*  intval;*  TreeNode*left;*  TreeNode*right;*  TreeNode():val(0),left(nullptr),right(nullpt......
  • Python多线程编程:竞争问题的解析与应对策略
    本文将深入探讨Python多线程编程中可能出现的竞争问题、问题根源以及解决策略,旨在帮助读者更好地理解、应对并发编程中的挑战。多线程竞争问题的复杂性源自于对共享资源的并发访问和操作。在不同线程间的交叉执行中,共享资源可能因无序访问而导致数据不一致、死锁或饥饿等问题。解决......
  • 二叉树
    二叉排序树classNode{ constructor(value){ this.value=value this.left=null this.right=null }}classTree{ constructor(){ this.root=null this.travelResult=[] } insertByFather(father,node){ if(father.value>node.value){ ......
  • Python 异步编程之yield关键字
    背景介绍在前面的篇章中介绍了同步和异步在IO上的对比,从本篇开始探究python中异步的实现方法和原理。python协程的发展流程:python2.5为生成器引用.send()、.throw()、.close()方法python3.3为引入yieldfrom,可以接收返回值,可以使用yieldfrom定义协程Python3.4加入了asy......
  • 《Java编程思想第四版》学习笔记47--关于handleEvent
    (4)增加可以被handleEvent()方法测试事件的组件到练习3中。过载handleEvent()并在文字字段中为每个组件显示特定的消息。                                                ......
  • 实验6 c语言结构体,枚举应用编程
    task4源代码1#include<stdio.h>2#include<string.h>3#defineN1045typedefstruct{6charisbn[20];//isbn号7charname[80];//书名8charauthor[80];//作者9doublesales_price;//......
  • shell补-特殊玩法-shell编程debug
    shell补-特殊玩法-shell编程debugdebug思想debug测试单步执行脚本自个调试,用注释,或者echo自个打印输出啥的,就这么搞bash-x整个脚本调试set与开关debug(适用于脚本或者命令行都可以)set-x开始debugset+x结束debug##在脚本启用set;set-x开始,set+x结尾......