代码随想录算法训练营day14 | leetcode 层序遍历 226.翻转二叉树 101.对称二叉树 2
层序遍历
/**
* 二叉树的层序遍历
*/
class QueueTraverse {
/**
* 存放一层一层的数据
*/
public List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
traverse(root, resList);
return resList;
}
/**
* 树的孩子节点可能有不止两个
*/
public void traverse(TreeNode node, List<List<Integer>> resList) {
// 判空
if (node == null) {
return;
}
// 准备
ArrayDeque<TreeNode> que = new ArrayDeque<>();
TreeNode cur;
// 循环开始
que.offer(node);
while (!que.isEmpty()) {
//len获取到的是每层一开始的数据大小
int len = que.size();
//对每一层的分别建立一个list存放本层数据
List<Integer> subList = new ArrayList(len);
while (len > 0) {
//取出本层节点并删除
cur = que.poll();
len--;
// visit
subList.add(cur.val);
if (cur.left != null) {
que.offer(cur.left);
}
if (cur.right != null) {
que.offer(cur.right);
}
}
//一层的数据遍历添加完毕 开始下一层
resList.add(subList);
}
}
/**
* 单纯遍历所有元素
*/
public void visit(TreeNode root) {
ArrayDeque<TreeNode> queue = new ArrayDeque<>();
TreeNode p = root,temp = null;
queue.offer(p);
while (!queue.isEmpty()) {
// visit 节点
temp = queue.poll();
System.out.println(temp.val);
if (p.left != null) {
queue.offer(temp.left);
}
if (p.right != null) {
queue.offer(temp.right);
}
}
}
}
LeetCode 226.翻转二叉树
分析1.0
仔细看题,题目中的翻转二叉树是整个树一起翻转,不是只翻转节点的左右孩子
选择遍历顺序-中序遍历(左子树翻转(左子树成了右子树),根树翻转,右子树翻转)左子树翻转了两次
class Solution {
public TreeNode invertTree(TreeNode root) {
preOrder(root);
return root;
}
public void preOrder(TreeNode root){
if(root == null){
return;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
preOrder(root.left);
preOrder(root.right);
return;
}
}
LeetCode 101.对称二叉树 2
失误 对称二叉树比较的是子树,不光是子节点
比较每个节点的左右子树是否相等,树又是由节点组成的,就是同步遍历根节点左右两颗子树,比较节点是否相等
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return false;
}
return visit(root.left, root.right);
}
public boolean visit(TreeNode node1, TreeNode node2){
if(node1 == null && node2 != null){
return false;
}
if(node2 == null && node1 != null){
return false;
}
if(node1 == null && node2 == null){
return true;
}
if(node1.val != node2.val){
return false;
}
visit(node1.left, node2.left);
visit(node1.right, node2.right);
return true;
}
}
分析2.0
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 compareOutside = compare(left.left, right.right);
// 比较内侧
boolean compareInside = compare(left.right, right.left);
return compareOutside && compareInside;
}
}
总结
- 树类题目注意区别孩子节点和子树
- 数组、字符串移除某个元素后,长度会发生变化,遍历中注意索引发生变化,树在遍历过程中的操作也会影响原本的遍历思路
- 不同的深度遍历顺序有不同的使用场景,注意具体问题具体分析
- 节点要非null才能进行操作 类似栈、队列非空才能操作一样
常用变量名增量更新
size、val、ans、cnt、cur、pre、next、left、right、index、gap、tar、res、src、len、start、end、flag、ch
代码随想录算法训练营day14 | leetcode 层序遍历 226.翻转二叉树 101.对称二叉树 2的更多相关文章
- Java实现 LeetCode 101 对称二叉树
101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2 ...
- LeetCode 101 对称二叉树的几种思路(Python实现)
对称二叉树 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \3 4 4 3 但是下面这个 [1,2,2 ...
- Binary Tree Zigzag Level Order Traversal (LeetCode) 层序遍历二叉树
题目描述: Binary Tree Zigzag Level Order Traversal AC Rate: 399/1474 My Submissions Given a binary tree, ...
- Leetcode题目101.对称二叉树(简单)
题目描述: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null ...
- LeetCode 101. 对称二叉树(Symmetric Tree)
题目描述 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null, ...
- LeetCode 101.对称二叉树 - JavaScript
题目描述:给定一个二叉树,检查它是否是镜像对称的. 题目分析 下面这种二叉树就是镜像对称的,符合题目要求: 1 / \ 2 2 / \ / \ 3 4 4 3 解法 1:递归检查 根据题目" ...
- 【LeetCode】101. 对称二叉树
题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3, ...
- LeetCode【101. 对称二叉树】
对称二叉树,就是左节点的左节点等于右节点的右节点,左节点的右节点等于右节点的左节点. 很自然就想到迭代与递归,可以创建一个新的函数,就是另一个函数不断的判断,返回在主函数. class Solutio ...
- 【leetcode 简单】第二十二题 对称二叉树
给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nul ...
- [LeetCode] N-ary Tree Level Order Traversal N叉树层序遍历
Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
随机推荐
- 打印九九乘法表,打印金字塔-java
/** * *** ***** 打印如图金字塔 *=i*2-1 (竖)空格数=列数-1 */ public class Circulate{ public static void main(Strin ...
- python安装与初识
一.Linux基础 - 计算机以及日后我们开发的程序防止的服务器的简单操作 二.Python开发 http://www.cnblogs.com/wupeiqi/articles/5433893.htm ...
- JavaScript:变量的作用域,window对象,关键字var/let与function
为什么要将这些内容放在一起,因为他们都跟初始化有关系,我们慢慢说吧. 我们在代码中,都会声明变量.函数和对象,然后由浏览器解释器(下面简称浏览器)执行: 我们还说过,变量和对象的内存结构: 那么,是什 ...
- [python] NetworkX实例
文章目录 NetworkX实例 1. 基础Basic 2. 绘图Drawing 3. 图标Graph NetworkX实例 代码下载地址 NetworkX 2.4版本的通用示例性示例.本教程介绍了约定 ...
- (8)go-micro微服务Mysql配置
目录 一 gorm介绍 二 gorm安装 1.1 下载依赖 1.2 使用MySQL驱动 三 CURD操作 1. 查询 1.1 单行查询 1.2 多行查询 2. 插入数据 3. 更新数据 4. 删除数据 ...
- DVWA系列1:搭建 DVWA 环境
DVWA系列1:搭建 DVWA 环境 DVWA 是一个合法的漏洞测试.学习环境,先引用一段官方的介绍: Damn Vulnerable Web Application (DVWA) is a PHP/ ...
- C# 10 Lambda 语法的改进
C# 10 包括了对 Lambda 表达式的处理方式的许多改进: Lambda 表达式可以具有自然类型,这使编译器可从 Lambda 表达式或方法组推断委托类型. 如果编译器无法推断返回类型,Lamb ...
- (原创)【B4A】一步一步入门01:简介、开发环境搭建、HelloWorld
一.前言 作者注:絮絮叨叨,可跳过不看. 一直有开发跨平台软件的需求.因为我的主力是C# ,所以当MAUI出现后,我欣喜若狂的开始学习研究.但是经历了两个月左右的时间,我弃坑了,我发现MAUI不是我能 ...
- 【SW】利用3D打印机打印 PCB 钢网的方法
每完成一个小作品以后,PCB打样回来,手工焊接着费时费力,定制钢网又未免太过浪费,想到自己有一台 FDM 3D 打印机,是不是可以通过 3D 打印机打印 "钢网" 呢? 在网上也翻 ...
- 【Oculus Interaction SDK】(一)设置 VR 相机与控制器 && 实现简单的抓取功能
前言 前段时间 Oculus 的 SDK 频繁更新,很多已有的教程都不再适用于现在的版本了.本系列文章的主要目的是记录现版本常见功能的实现方法,便于自己后续开发.当然,不排除我文章刚写完 SDK 又变 ...