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

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

作者: 程序员小2 | 来源:发表于2023-12-15 09:08 被阅读0次
    假唱

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

    考考你

    题目:

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

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

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

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

    示例 1:


    image.png

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


    image.png
    输入: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 是一棵 完美 二叉树

    思路:

    思考

    广度优先搜索,

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

    java代码:

    /**
     * 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;
        }
    }
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/hipwgdtx.html