代码随想录算法训练营第15天 102.二叉树的层序遍历

news/2024/11/29 5:37:47/

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>> levelOrder(TreeNode root) {List<List<Integer>>  result = new ArrayList<>();if(root == null){return result;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){// 获取当前层级节点的数量int size = queue.size();List<Integer> list = new ArrayList<>();for(int i = 0; i < size; i++ ){TreeNode node = queue.poll();list.add(node.val);if(node.left != null){queue.offer(node.left);}if(node.right != null){queue.offer(node.right);}}result.add(list);}return result;}
}

same with

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

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

226. 翻转二叉树

 

/*** 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 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 temp = root.left;root.left = root.right;root.right = temp;}
}

首先递归地翻转了当前节点的左子树和右子树,然后在返回到当前节点时,交换了它的左子树和右子树。在翻转子树之后再交换当前节点的左右子树

把交换左右子树的代码放在了一个单独的方法中,这使得代码更易于理解和维护。

前序遍历和后序遍历都可以用来解决这个问题,

但中序遍历不行。这是因为在中序遍历中,我们需要先处理左子树,然后处理当前节点,最后处理右子树,如果在处理当前节点时交换左右子树,那么处理右子树时实际上处理的是原来的左子树,所以不能得到正确的结果。

在时间复杂度和空间复杂度方面,是O(n)和O(h),其中n是二叉树中的节点数,h是二叉树的高度。

101. 对称二叉树

/*** 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 boolean isSymmetric(TreeNode root) {return root == null || isSymmetricHelper(root.left, root.right);}private boolean isSymmetricHelper(TreeNode left, TreeNode right) {if (left == null || right == null) {return left == right;}if (left.val != right.val) {return false;}return isSymmetricHelper(left.left, right.right) && isSymmetricHelper(left.right, right.left);}
}

首先检查根节点是否为null,如果是,那么树就是对称的。如果根节点不为null,那么就调用辅助方法 isSymmetricHelper 来检查根节点的左右子树是否对称。

isSymmetricHelper 方法首先检查传入的两个节点是否为null,如果其中一个为null,那么只有当另一个节点也为null时,这两个节点才对称。

如果两个节点都不为null,那么就比较他们的值是否相等,如果不相等,那么这两个节点就不对称。

如果两个节点的值相等,那么就递归地比较这两个节点的左右子树是否对称。因为对于一个对称的二叉树,任何两个对称的节点的左子树都和另一个节点的右子树对称,所以我们递归地调用 isSymmetricHelper 来比较这两个节点的左右子树。

这个方法的时间复杂度是O(n),其中n是二叉树中的节点数,因为我们需要遍历树中的每一个节点。空间复杂度是O(h),其中h是二叉树的高度,这是因为在递归的过程中需要使用到栈空间,最大深度就是树的高度。


http://www.ppmy.cn/news/857364.html

相关文章

开放式耳机选购指南!开放式耳机品牌推荐有哪些?开放式耳机的优缺点有哪些?韶音、南卡、cleer、索尼、飞利浦、Oladance等开放式蓝牙耳机推荐!

经常会看到很多人佩戴着开放式蓝牙耳机跑步运动、骑行、通勤路上等&#xff0c;随着开放式耳机品牌越来越多了&#xff0c;导致很多小伙伴不知道如何选购心仪那款耳机。本人作为耳机数码发烧友&#xff0c;对开放式耳机这方面有绝对选择权&#xff01;多少知道市面上有哪些开放…

雷霆战机android代码,雷霆战机代码

【实例简介】 雷霆战机代码,很不错,非常好玩,自己编的,希望你们下载看看 【实例截图】 【核心代码】 雷霆战机代码、 └── 雷霆战机代码、 ├── bin │ ├── About.class │ ├── adj_explodeBomb2.png │ ├── bDaodan.png │ ├── bgd1.mid │ ├─…

C++ 雷霆战机 附完整源码

先来看看效果图吧~ 游戏是有音乐的&#xff0c;很动感哦 具体的实现如何和Java开发雷霆战机是一样的。可以参见主页Java 开发雷霆战机的原理&#xff0c;写的很详细。源码已经打包好了放群里了。有需要的效果可以进来下载。 这些小游戏可以培养开发兴趣和维持码感。 有空大家都…

c语言雷霆战机小游戏

#include<stdio.h> #include<string.h> #include<conio.h> #include<windows.h> #include<stdlib.h> #define MAX 100 long long int speed 0;//控制敌机的速度 int position_x, position_y;//飞机的所在位置 int high, width;//地图的大小 …

java雷霆战机代码判断死亡_用Java开发简单又好玩的——雷霆战机小游戏几行代码就搞定...

用Java开发简单又好玩的——雷霆战机小游戏几行代码就搞定 用Java开发简单又好玩的——雷霆战机小游戏&#xff0c;几行代码就搞定 资源加载 音乐播放 创建子弹类 创建爆炸和珍宝类 创建导弹和飞机类 鼠标键盘控制 新建项目:Java Project -> planewar 将图片文件资源和音乐文…

python numpy数组动态写入csv文件_关于python:将NumPy数组转储到csv文件中

有没有办法将一个numpy数组转储到csv文件中?我有一个2d numpy数组,需要以人类可读的格式转储它。 numpy.savetxt将数组保存到文本文件中。 import numpy a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ]) numpy.savetxt("foo.csv", a, delimiter=",") …

FunCode太空战机C++实现

仅供交流学习使用&#xff0c;因博主水平有限&#xff0c;有错误欢迎批评指正 作者&#xff08;即博主本人&#xff09;&#xff1a; Akame Qixisi / Excel Bloonow IDE&#xff1a;Code::Blocks 17.12 编译器需要支持C14或以上标准&#xff08;Code::Blocks如何设置见附录Ⅰ&…

python写出雷霆战机_利用Python自制雷霆战机小游戏,娱乐编程,快乐学习!

开发工具 Python版本&#xff1a;3.6.4 相关模块&#xff1a; pygame模块&#xff1b; 以及一些Python自带的模块。 环境搭建 安装Python并添加到环境变量&#xff0c;pip安装需要的相关模块即可。 先睹为快 在cmd窗口运行"Game10.py"文件即可。 效果如下&#xff1a…