Day15打卡! 时长:2h

今日感想:今天主要学习了二叉树层次遍历的思路方法和应用。题目看似简单,实则有很多细节,有时间可以做做其他相似的推荐题目~

Leetcode102 二叉树的层序遍历

题目链接:Leetcode102 二叉树的层序遍历

思路:

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

学会二叉树的层序遍历,可以一口气打完以下十题:

  • 102.二叉树的层序遍历
  • 107.二叉树的层次遍历II
  • 199.二叉树的右视图
  • 637.二叉树的层平均值
  • 429.N叉树的层序遍历
  • 515.在每个树行中找最大值
  • 116.填充每个节点的下一个右侧节点指针
  • 117.填充每个节点的下一个右侧节点指针II
  • 104.二叉树的最大深度
  • 111.二叉树的最小深度

代码:以102为例

/*** 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 List<List<Integer>> resList = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(TreeNode root) {//checkFun01(root,0);checkFun02(root);return resList;}//DFS--递归方式public void checkFun01(TreeNode node, Integer deep) {if (node == null) return;deep++;if (resList.size() < deep) {//当层级增加时,list的Item也增加,利用list的索引值进行层级界定List<Integer> item = new ArrayList<Integer>();resList.add(item);}resList.get(deep - 1).add(node.val);checkFun01(node.left, deep);checkFun01(node.right, deep);}//BFS--迭代方式--借助队列public void checkFun02(TreeNode node) {if (node == null) return;Queue<TreeNode> que = new LinkedList<TreeNode>();que.offer(node);while (!que.isEmpty()) {List<Integer> itemList = new ArrayList<Integer>();int len = que.size();while (len > 0) {TreeNode tmpNode = que.poll();itemList.add(tmpNode.val);if (tmpNode.left != null) que.offer(tmpNode.left);if (tmpNode.right != null) que.offer(tmpNode.right);len--;}resList.add(itemList);}}
}

Leetcode226 翻转二叉树

题目链接:Leetcode226 翻转二叉树

第一想法:这题难道也要借助一个辅助队列来实现吗,遍历的时候先将右节点入队?

讲解后想法:

遍历的过程中只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果。

这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!层序遍历也可以!

共六种方法:递归法(前序、后序)、迭代法(深度优先DFS(前序、中序(用栈实现)、后序)、广度优先BFS(层序遍历))

遇到的困难:这块整了半天,感觉很有意思~

代码: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

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

Leetcode101 对称二叉树

题目链接:Leetcode101 对称二叉树

第一想法:如果要轴对称的话,感觉和翻转二叉树...有点像?

讲解后想法:

重点要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。

比较方法:本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中

递归三部曲

1.确定递归函数的参数和返回值

要比较的是两个树,参数自然也是左子树节点和右子树节点,返回值是bool类型。

2.确定终止条件

要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。

节点为空的情况有:(我们比较的其实不是左孩子和右孩子)

  • 左为空,右不为空,不对称,return false
  • 左不为空,右为空,不对称,return false
  • 左右都为空,对称,返回true

此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:

  • 左右都不为空,比较节点数值,不相同就return false

此时左右节点不为空,且数值也不相同的情况我们也处理了。

3.确定单层递归的逻辑

此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

  • 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
  • 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
  • 如果左右都对称就返回true ,有一侧不对称就返回false 。

相关题目:

  • 100.相同的树
  • 572.另一个树的子树

遇到的困难:这道题目深入理解下还是有点难度的,先掌握递归法~

代码:(递归法)

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

代码随想录算法训练营Day15|Leetcode102二叉树的层序遍历、Leetcode226翻转二叉树、Leetcode101对称二叉树相关推荐

  1. 代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2

    代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2 1.1 层序遍历 10 1.1.1 102.二叉树的层序遍历 思路: 通过队列实现 class Solut ...

  2. 代码随想录算法训练营day15 | 102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树

    102. 二叉树的层序遍历 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {de ...

  3. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  4. 代码随想录算法训练营第十三天|102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

    链接:代码随想录 文章目录 102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树 解题方法 题目思路 示例代码 总结 解题思路 1.102.二叉树的层次遍历 解题思路 递归法,创立二维数组 ...

  5. 代码随想录算法训练营day1

    代码随想录算法训练营第一天| 704. 二分查找.27. 移除元素. 704.二分查找 题目链接:leetcode704 Binary search 暴力解法: class Solution {pub ...

  6. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  7. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...

  8. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

  9. 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

最新文章

  1. Nginx中worker_connections的问题
  2. 【MFC】创建第一个应用程序
  3. (七)boost库之单例类
  4. 他毕业于北师大,编写了我国首套数学教材,陈景润华罗庚都崇拜他
  5. 精度76.16%,速度是SlowFast的4.5倍,视频理解模型PP-TSM重磅发布
  6. 解读革命性容器集群CCE Turbo:计算、网络、调度全方位加速
  7. 计算机网络实训简介,计算机网络实验报告介绍.doc
  8. sql server2012中使用convert来取得datetime数据类型样式(全)
  9. 河北520分理科计算机专业,河北最幸运考生,520分“捡漏”考上中国人民公安大学,网友:铁饭碗...
  10. [leetcode] 5331. 跳跃游戏 V
  11. MacBook Air 过热降温技巧
  12. 如何在阿里云里申请并使用免费https证书SSL、nginx下配置https证书
  13. Linux 网易云API搭建笔记
  14. echart 迁徙图
  15. 中国研修网计算机培训心得,网络研修培训心得体会(精选7篇)
  16. python定位元素_Python元素定位
  17. 图片上怎么加文字?看完就你知道了
  18. 【微信聊天发的表情看不到,显示错误】
  19. 金泰克/tigo S300 240G SM2256K H27QFG8PEM5R 完整开盘教程
  20. SQL如何修改表中的结构

热门文章

  1. java计算机毕业设计小型健身俱乐部网站源码+lw文档+系统+数据库
  2. 淘某某宝app接口最新xsign算法分析
  3. 【IT之路】性能测试系列 -- 初识性能测试
  4. 2023年_2月学习计划表
  5. [网络收集]为了保护您眼睛视力,请对Vista/Win7/XP作如下设置
  6. 【190115】VC++ 视频聊天系统源代码
  7. 国美向京东“宣战”究竟底气何来?
  8. c语言明星字符,盘点几个明星因为“C位”闹出的尴尬事
  9. 京东到家交易系统的演进之路
  10. 详谈10G XFP万兆光模块有哪些类型?