代码随想录算法训练营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, ...
随机推荐
- mysql-front连接mysql报错1251解决方法
客户端不通过服务器的验证,建议升级mysql客户端 出现错误的原因是mysql版本问题,由于mysql8.0版本与mysql5.0版本加密方式不同,导致mysql-front无法通过验证. mysql ...
- Python编程规范之PEP8
Python编程规范-PEP8 PEP是 Python Enhancement Proposal 的缩写. 英文链接: https://legacy.python.org/dev/peps/pep-0 ...
- go-dongle 0.2.0 版本发布了,一个轻量级、语义化的 golang 编码解码、加密解密库
dongle 是一个轻量级.语义化.对开发者友好的 Golang 编码解码和加密解密库 Dongle 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧 github.com/g ...
- DOM(原生js事件绑定)
一:原生js事件绑定 1.开关灯案例 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Centos7下vim最新版本安装
一直以来用的都是vim,因为之前都是系统自带的vim没有研究过怎么自己安装,今天趁着刚装完新系统,顺便装下vim. 同样vim也有两种安装方法: 一.yum安装,centos下安装软件最简单的方法了, ...
- [python] 基于matplotlib_venn实现维恩图的绘制
文章目录 VENN DIAGRAM(维恩图) 1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups 2. 具有3个组的基本维恩图 Venn diagram with ...
- 《STL源码剖析》Sort排序分析
整体而言: sort算法在数据量大时采用Quick Sort(快速排序),一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负担,就改用Insertion Sort(插 ...
- BC4-牛牛学说话之-浮点数
题目描述 会说整数之后,牛牛开始尝试浮点数(小数),输入一个浮点数,输出这个浮点数. 输入描述 输入一个浮点数 输出描述 输出一个浮点数,保留三位小数 示例 1 输入:1.359578 输出:1.36 ...
- python实现简单信息收集
python实现简单信息收集 import whois import socket import sys def Query(domain): ip = socket.gethostbyname(st ...
- 【学习笔记】Tarjan 图论算法
- 前言 本文主要介绍 Tarjan 算法的「强连通分量」「割点」「桥」等算法. 争取写的好懂一些. - 「强连通分量」 - 何为「强连通分量」 在有向图中,如果任意两个点都能通过直接或间接的路径相互 ...