算法学习day15

news/2024/11/22 18:04:40/

文章目录

      • 102. 二叉树层序遍历
        • 思路
        • 递归
      • 226 翻转二叉树
        • 递归
        • 迭代
      • 101 对称二叉树
        • 递归
      • 总结

102. 二叉树层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)

示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:输入:root = [1]
输出:[[1]]
示例 3:输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000]
  • -1000 <= Node.val <= 1000

思路

  • 广度优先,借助队列实现,.
  • 队列的长度也就是每层的元素个数,也就是出队列的个数,即每层的元素值
/*** 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>> res = new ArrayList<>();if (root == null) {return res;}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);}}res.add(list);}return res;}
}

递归

  • 递归的本质即是“栈”
  • 深度优先遍历
class Solution {List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {level(root, 1);return res;}public void level(TreeNode root, int deepth){if(root == null)    return ;//返回列表中的元素个数==层级数if(res.size() < deepth){List<Integer> item = new ArrayList<Integer>();res.add(item);}res.get(deepth-1).add(root.val);//左右节点位于同一层级deepth+1level(root.left, deepth+1);level(root.right, deepth+1);}
}

226 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3]
输出:[2,3,1]
示例 3:输入:root = []
输出:[]
提示:树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100

递归

  • 观察翻转后的结果,实质上时每个节点左右子树的翻转,每个都翻转可联想到递归实现
/*** 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) {//终止条件 节点为nullif(root == null)    return root;//递归内容,交换左右节点TreeNode temp = root.left;root.left = root.right;root.right = temp;//递归入参,每个节点invertTree(root.left);invertTree(root.right);return root;}
}

迭代

  • 迭代遍历中先序遍历:根左右,入栈跟右左,交换左右节点顺序即可
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null) {return null;}   Stack<TreeNode> stack = new Stack<TreeNode>();stack.push(root);while(!stack.isEmpty()) {TreeNode node = stack.pop();if(node.right!= null) {stack.push(node.right);}if(node.left!= null) {stack.push(node.left);}TreeNode temp = node.left;node.left = node.right;node.right = temp;}return root;}
}

101 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

输入:root = [1,2,2,3,4,4,3] 输出:true输入:root = [1,2,2,null,3,null,3]
输出:false
提示:树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100

递归

  • 对称,左右子树的内测和外侧要分别相同,左子树的左侧右子树的右侧;左子树的右侧右子树的左侧

  • 递归入参:内外侧子树

  • 终止条件:有一个子树为空,或者值不相等

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

总结

  • 二叉树的解法需要借助:栈和队列实现,
  • 递归很容易也很难,三要素:终止条件、返回值、局部变量

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

相关文章

深度学习架构-Tensorflow

19考题 深度学习基本概念 人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能的目的 就是让计算机能够像人一样思考。 强人工智能&#xff1a;就是要使机器学习人的理解、学习和执行任务的能力。 弱人工智能&#xf…

【Python】Python系列教程-- Python3 标准库概览(三十)

文章目录 前言操作系统接口文件通配符命令行参数字符串正则匹配数学访问互联网日期和时间数据压缩性能度量测试模块 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列…

适合平板用的Android版本,安卓平板专享 推荐五款Pad版应用浏览器

平板市场&#xff0c;硝烟四起&#xff0c;各品牌展开混战&#xff0c;杀得是你死我活&#xff0c;都想要自己分到手的蛋糕多一点。同样的&#xff0c;网络浏览器市场也竞争激烈&#xff0c;各软件商争相抢出Pad版或HD版浏览器&#xff0c;让用户的选择多了起来。今天&#xff…

平板电脑推荐 资深游戏玩家最爱的这款5G平板来了!

一说到打游戏&#xff0c;对于喜欢通过玩游戏放松心情或者是用游戏来获取更刺激的娱乐体验的资深游戏玩家来说&#xff0c;如果网络运行不畅通有卡顿、画质不清晰到人物一运动就出现像素点&#xff0c;就会产生极大的难受感&#xff0c;一股郁闷之气油然而生。笔者玩游戏就没有…

android 平板桌面,RUI平板桌面

RUI平板桌面是一款非常实用的智能分类管理桌面手机软件&#xff0c;拥有多套主题&#xff0c;随心而换&#xff0c;各种实用小插件让操作变得异常容易&#xff0c;让分类、管理、下载程序在桌面上一步到位。 软件特色&#xff1a; 1.分类管理应用&#xff0c;应用自动智能分类&…

android平板值得买吗,最值得买大推荐 全新安卓平板你选谁?

原标题&#xff1a;最值得买大推荐 全新安卓平板你选谁&#xff1f; 【IT168 导购】现如今市售安卓平板电脑日益增多&#xff0c;国产产品也全面崛起&#xff0c;不仅在外观设计上更为时尚&#xff0c;同时在硬件配置上也更为主流。本文将为大家推荐几款市售高人气国产全新安卓…

有奖征文 | 夙兴夜寐,铸梦网安

出品&#xff5c;MS08067实验室&#xff08;www.ms08067.com&#xff09; 本文作者&#xff1a;潜龙勿用 01 时光荏苒&#xff0c;流年岁月如白驹过隙&#xff0c;不停飞逝于眼前&#xff0c;在这车马星驰的人间&#xff0c;踏入网络安全领域已然三年有余。我也终于从一开始的不…

JS 箭头函数

ES6箭头函数是一种新定义的函数类型&#xff0c;它可以更容易地编写简洁、可读性强且易于维护的代码。在本文中&#xff0c;我们将探讨ES6箭头函数的定义、特性以及箭头函数的简写。 1. 箭头函数的定义 ES6箭头函数是一种匿名函数&#xff0c;使用“>”符号定义。与常规函…