代码随想录刷题day15|二叉树的层序遍历翻转二叉树对称二叉树

news/2024/7/24 6:15:56 标签: 算法

文章目录

  • day15学习内容
  • 一、二叉树的层序遍历
    • 1.1、思路
    • 1.2、错误写法
    • 1.3、正确写法
  • 二、翻转二叉树
    • 2.1、思路
    • 2.2、正确写法
  • 三、对称二叉树
    • 2.1、怎么判断是否可以翻转
    • 2.2、思路
    • 2.3、正确代码
  • 总结
    • 1.感想
    • 2.思维导图


day15学习内容

day15主要内容

  • 二叉树的层序遍历
  • 翻转二叉树
  • 对称二叉树,其实就是判断2个树能不能翻转。

声明
本文思路和文字,引用自《代码随想录》

一、二叉树的层序遍历

102.原题链接

1.1、思路

  • 从根节点开始遍历树,把每一层的节点放入到队列中。

1.2、错误写法

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        if (root == null) {
            return result;
        }
        deque.offer(root);
        while (root!=null) {
            List<Integer> itemList = new ArrayList<>();
            int size = deque.size();
            while (size > 0) {
                TreeNode tmpNode = deque.poll();
                itemList.add(tmpNode.val);
                if (tmpNode.left != null) {
                    deque.offer(tmpNode.left);
                }
                if (tmpNode.right != null) {
                    deque.offer(tmpNode.right);
                }
                size--;
            }
            result.add(itemList);
        }

        return result;
    }
}

为什么这么写是错的。
很明显,能写出这种代码说明没有理解思路。没有理解怎么保存当前层的节点个数。

1.3、正确写法

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        if (root == null) {
            return result;
        }
        deque.offer(root);
        while (!deque.isEmpty()) {
            List<Integer> itemList = new ArrayList<>();
            int size = deque.size();
            while (size > 0) {
                TreeNode tmpNode = deque.poll();
                itemList.add(tmpNode.val);
                if (tmpNode.left != null) {
                    deque.offer(tmpNode.left);
                }
                if (tmpNode.right != null) {
                    deque.offer(tmpNode.right);
                }
                size--;
            }
            result.add(itemList);
        }

        return result;
    }
}

二、翻转二叉树

226.原题链接

2.1、思路

  • 使用递归实现翻转
  • 比较简单的一题吧

2.2、正确写法

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return root;
        }
        swapChirdren(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;

    }

    private TreeNode swapChirdren(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        return root;
    }
}

三、对称二叉树

101.原题链接

核心思路比较根节点的两个子树是否是相互翻转的

2.1、怎么判断是否可以翻转

所谓是否可以翻转,就是判断左子树的左侧节点和右子树的右节点是否值相等,如果存在且值相等,就认为是可以翻转的。
也就是外侧和外侧相比,内侧和内侧相比。

2.2、思路

本题采用递归实现,所以想一下递归三部曲的思路,

  • 确定返回值和参数
    • 返回值肯定是树
    • 参数:因为要翻转,所以要把左子树和右子树传入
  • 确定递归终止条件
    • 递归结束条件比较多,
    • 1、左子树为空,右子树不为空,肯定不能翻转
    • 2、左子树不为空,右子树为空,肯定不能翻转
    • 3、左右子树都为空,可以翻转
    • 4、左右子树都不为空,且值不相等,肯定不能翻转
    • 5、左右子树都不为空,且值相等,需要继续递归判断能否翻转。
  • 确定单层递归逻辑,也就是如何向下一层遍历
    • 按照上面分析,判断能不能翻转就是要2种情况
      • 判断左子树的左节点和右子树的右节点是否值相等(比较好理解,想象一下镜像就行)
      • 断左子树的右节点和右子树的左节点是否值相等(比较好理解,想象一下镜像就行)

2.3、正确代码

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }

    private boolean compare(TreeNode left, TreeNode right) {
        if (left == null && right != null) {
            return false;
        }
        if (left != null && right == null) {
            return false;
        }
        if (left == null && right == null) {
            return true;
        }
        if (left.val != right.val) {
            return false;
        }
        boolean b1 = compare(left.left, right.right);
        boolean b2 = compare(left.right, right.left);
        //内侧和外侧的结果需要告诉上一层的父节点,
        return b1 && b2;
    }

}

总结

1.感想

  • 比较顺利的一天,对称二叉树要好好想一下思路。

2.思维导图

本文思路引用自代码随想录,感谢代码随想录作者。


http://www.niftyadmin.cn/n/5411161.html

相关文章

css补充(上)

有关字体 1.所有有关字体的样式都会被继承 div {font-size: 30px;}<span>777</span> <div>123<p>456</p> </div>span中777是默认大小16px div设置了30px p作为div的后代继承了字体样式也是30px 2.字体颜色 div{color: red;border: 1px …

部署LVS负载均衡架构

目录 一、ipvsadm 工具 二、NAT模式下部署LVS负载均衡 1、部署NFS共享存储服务器 1.1 安装NFS软件 1.2 新建共享目录和站点文件 1.3 设置共享策略 2、部署节点服务器1 2.1 安装并启动nginx软件 2.2 挂载共享目录到网页站点目录 2.3 修改网关 3、部署节点服务器2 3.…

【C++】String常用的函数总结

目录 一、string的构造函数方式&#xff1a; 二、常用的大小/容量相关操作&#xff1a; 三、string的常用修改操作&#xff1a; 四、string的遍历&#xff1a; 五、string的任意位置插入 / 删除&#xff1a; 六&#xff1a;补充&#xff1a; 一、string的构造函数方式&a…

Python 系统学习总结(基础语法+函数+数据容器+文件+异常+包+面向对象)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 六天时间系统学习Python基础总结&#xff0c;目前不包括可视化部分&#xff0c;其他部分基本齐全&#xff0c;总结记录&#xff0…

图解目标检测的现代历史

任务分类 图像分类 根据图像的主要对象对图像进行分类。 目标定位 预测包含主要对象的图像区域。然后&#xff0c;可以使用图像分类来识别该区域内的物体 目标检测 定位和分类出现在图像中的所有对象。这个任务通常包括&#xff1a;确定区域&#xff0c;然后对其中的对象进行…

three.js如何实现简易3D机房?(三)显示信息弹框/标签

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;(二&#xff09;模型加载的过渡动画&#xff1a;http://t.csdnimg.cn/onbWY 目录 七、创建信息展示弹框 1.整体思路 &#xff08;1&#xff09;需求&#xff1a; &#xff08;2&#xff09;思路&#xff1a;…

django学习记录07——订单案例(复选框+ajax请求)

1.订单的数据表 1.1 数据表结构 1.2 数据表的创建 models.py class Order(models.Model):"""订单号"""oid models.CharField(max_length64, verbose_name"订单号")title models.CharField(max_length64, verbose_name"名称&…

C#实现选择排序算法

以下是使用C#实现选择排序算法的示例代码&#xff1a; using System;class SelectionSort {static void Main(string[] args){int[] arr { 64, 25, 12, 22, 11 };Console.WriteLine("排序前&#xff1a;");PrintArray(arr);SelectionSortAlgorithm(arr);Console.Wr…