首页 > 其他分享 >代码随想录Day18

代码随想录Day18

时间:2022-11-07 00:22:07浏览次数:47  
标签:deque 遍历 TreeNode root 代码 随想录 right Day18 left

LeetCode 226  翻转二叉树

 

 

思路:遍历节点,交换左右孩子的顺序即可。前序遍历(中左右)、后序遍历(左右中)都可以,中序遍历这样写就行不通,会做多余的翻转操作。

遍历的写法:
1.确定参数和返回值   参数:根节点,返回值TreeNode。 这是题目规定好的,无需多言

2.终止条件      当前节点为空节点,返回

3.单层递归顺序。   前序,后序遍历都可。

 

迭代法的写法;
迭代法,主要是深度优先遍历和广度优先遍历的写法。

深度优先遍历(栈):  

1.当前节点不为空,压入栈

2.当栈内不为空,获取栈顶元素,出栈。

并交换栈顶元素的左右孩子

3.做前序遍历。如果栈顶存在左孩子,压入栈。左孩子遍历完再遍历右孩子。

 

广度优先遍历(层序遍历,队列):   把每层的值进行交换

广度优先遍历和深度优先遍历的不同之处在于。

广度优先遍历,拿到每一层的所有元素,进行一个顺序交换。深度优先遍历,从一个节点一直走下去,再往回走。

//DFS递归
class Solution {
   /**
     * 前后序遍历都可以
     * 中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换)
     */
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        invertTree(root.left);
        invertTree(root.right);
        swapChildren(root);
        return root;
    }

    private void swapChildren(TreeNode root) {
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }
}

//BFS
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {return null;}
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            while (size-- > 0) {    //区别于深度优先遍历,拿到当前层的所有元素。深度优先遍历是当前元素不为空,就一直走下去。
                TreeNode node = deque.poll();
                swap(node);
                if (node.left != null) {deque.offer(node.left);}
                if (node.right != null) {deque.offer(node.right);}
            }
        }
        return root;
    }

    public void swap(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
}

 

标签:deque,遍历,TreeNode,root,代码,随想录,right,Day18,left
From: https://www.cnblogs.com/dwj-ngu/p/16864710.html

相关文章

  • 逆向工程-代码生成器
    packagecom.atguigu.demo;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.ge......
  • 知识蒸馏 -- 简单代码 实现
    知识蒸馏还是先来简单回顾下知识蒸馏的基本知识。知识蒸馏的核心思想就是:通过一个预训练的大的、复杂网络(教师网络)将其所学到的知识迁移到另一个小的、轻量的网络(学生......
  • 设备信息脱离出驱动代码 ------ 设备驱动模型(设备、驱动、总线)
    设备(称为设备信息更为恰当):指的是CPU上的资源,比如一个LED接到GPIO1上,设备指的是CPU控制GPIO1所涉及的各个寄存器(时钟寄存器、方向寄存器等),而不是LED。  总线:设备信息和......
  • 代码风格改善
    代码风格改善googleguidestyle头文件头文件应该能够自给自足(self-contained,也就是可以作为第一个头文件被引入),以.h结尾。至于用来插入文本的文件,说到底它们并不是......
  • JavaIO流一部分代码实现
    创建文件代码importjava.io.File;importjava.io.IOException;publicclassMain{publicstaticvoidmain(String[]args){//writeyourcodehere......
  • 【原创】合约代码分析
    #打算研究下合约,会持续记录分析一些合约的代码,刚开始学习,错误疏漏之处之处希望大家不吝多多留言赐教。合约1:投票```jsxpragmasolidity^0.8.0;contractBallot{/......
  • 网络安全漏洞分析远程代码执行
    介绍ApacheFlume是一个分布式的,可靠的,并且可用于高效地收集,汇总和移动大量日志数据的软件。它具有基于流数据流的简单而灵活的体系结构。它具有可调的可靠性机制以及许......
  • 第三章:MyBatis框架Dao代理-动态代理简化代码
    第三章:MyBatis框架Dao代理内容列表◼Dao接口动态代理◼参数传递◼处理查询结果◼like和主键1Dao代理实现CURD1.1去掉Dao接口的实现类1.2getMapper......
  • 《代码大全》笔记第六篇
    第六部分:系统考虑这一部分主要分为四部分,程序规模对构建的影响、管理构建、集成、编程工具。主要是对软件的构建和管理。交流和规模:改善交流效......
  • 23种设计模式-抽象工厂模式介绍加实战代码
    1、描述通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品。工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法......