LeetCode算法练习top100:(5)二叉树

package top100.top二叉树;import top100.TreeNode;import java.util.*;public class TOP {//94. 二叉树的中序遍历List<Integer> res = new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {inorder(root);return res;}private void inorder(TreeNode root) {if (root != null) {inorder(root.left);res.add(root.val);inorder(root.right);}}//104. 二叉树的最大深度int maxDepth = 0;public int maxDepth(TreeNode root) {if (root == null) {return maxDepth;}dfsMaxDepth(root, 0);return maxDepth;}private void dfsMaxDepth(TreeNode root, int res) {if (root == null) {maxDepth = Math.max(maxDepth, res);} else {dfsMaxDepth(root.left, res + 1);dfsMaxDepth(root.right, res + 1);}}//226. 翻转二叉树public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}TreeNode right = root.right;root.right = root.left;root.left = right;invertTree(root.left);invertTree(root.right);return root;}//101. 对称二叉树public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}return isSymmetric(root.left, root.right);}public boolean isSymmetric(TreeNode left, TreeNode right) {if (left == null && right == null) {return true;} else if (left == null || right == null) {return false;} else if (left.val != right.val) {return false;} else {return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);}}//543. 二叉树的直径int diameterOfBinaryTree = 0;public int diameterOfBinaryTree(TreeNode root) {dfsDiameterOfBinaryTree(root);return diameterOfBinaryTree;}//计算当前节点到其叶子节点的最长距离private int dfsDiameterOfBinaryTree(TreeNode root) {if (root == null) return 0;//左右节点的最长距离int l = dfsDiameterOfBinaryTree(root.left);int r = dfsDiameterOfBinaryTree(root.right);diameterOfBinaryTree = Math.max(diameterOfBinaryTree, l + r);return Math.max(l, r) + 1;}//102. 二叉树的层序遍历public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {int n = queue.size();List<Integer> list = new ArrayList<>();for (int i = 0; i < n; i++) {TreeNode node = queue.poll();list.add(node.val);if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}res.add(list);}return res;}//108. 将有序数组转换为二叉搜索树public TreeNode sortedArrayToBST(int[] nums) {if (nums.length == 0) return null;int start = 0, mid = (nums.length - 1) / 2;TreeNode root = new TreeNode(nums[mid]); //二叉搜索树的根节点是中序遍历数组中间的数if (mid - start > 0) { //如果数组可以构成左子树root.left = sortedArrayToBST(Arrays.copyOfRange(nums, start, mid));}if (mid < nums.length - 1) { //如果数组可以构成右子树root.right = sortedArrayToBST(Arrays.copyOfRange(nums, mid + 1, nums.length));}return root;}//98. 验证二叉搜索树long preVal = Long.MIN_VALUE; //为了通过测试用例,设置比int最小还要小的值public boolean isValidBST(TreeNode root) {if (root == null) return true;//先判断左子树是否满足if (!isValidBST(root.left)) {return false;}//中序是否满足递增if (root.val <= preVal) {return false;}preVal = root.val; //更新pre值//判断又子树return isValidBST(root.right);}//230. 二叉搜索树中第K小的元素int res1;int k;ArrayList<Integer> list = new ArrayList<>();public int kthSmallest(TreeNode root, int k) {this.k = k;inOrder(root, k);return res1;}//中序遍历,从最小结点开始遍历:二叉搜索树的中序遍历为递增序列private void inOrder(TreeNode root, int k) {if (root == null) return;if (root.left != null) {inOrder(root.left, k);}list.add(root.val);if (list.size() == k) {res1 = root.val;return;}if (root.right != null) {inOrder(root.right, k);}}//230. 二叉搜索树中第K小的元素int res1;int k;public int kthSmallest(TreeNode root, int k) {this.k = k;inOrder(root);return res1;}private void inOrder(TreeNode root) {if (root == null) return;//先递归到左端点inOrder(root.left);if (k == 0) return;//遍历到第k个if (--k == 0) res1 = root.val;//中序遍历inOrder(root.right);}//199. 二叉树的右视图public List<Integer> rightSideView(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {int n = queue.size();for (int i = 0; i < n; i++) {TreeNode cur = queue.poll();if (i == n - 1) {res.add(cur.val);}if (cur.left != null) {queue.add(cur.left);}if (cur.right != null) {queue.add(cur.right);}}}return res;}//114. 二叉树展开为链表//方法1:逆前序遍历TreeNode preTreeNode = null;public void flatten(TreeNode root) {if (root == null) {return;}flatten(root.right);flatten(root.left);root.left = null;root.right = preTreeNode;preTreeNode = root;}//方法2:前序遍历后重组public void flatten(TreeNode root) {ArrayList<TreeNode> list = new ArrayList<>();preOder(root, list);for (int i = 1; i < list.size(); i++) {TreeNode pre = list.get(i - 1);TreeNode cur = list.get(i);pre.left = null;pre.right = cur;}}private void preOder(TreeNode root, ArrayList<TreeNode> list) {if (root != null) {list.add(root);if (root.left != null) {preOder(root.left, list);}if (root.right != null) {preOder(root.right, list);}}}//105. 从前序与中序遍历序列构造二叉树public TreeNode buildTree(int[] preorder, int[] inorder) {int n = preorder.length;if (n == 0) return null;TreeNode root = new TreeNode(preorder[0]);//获取根节点在中序的位置int mid = 0;for (int i = 0; i < n; i++) {if (inorder[i] == preorder[0]) {mid = i;break;}}//构造左右子树root.left = buildTree(Arrays.copyOfRange(preorder, 1, mid + 1), Arrays.copyOfRange(inorder, 0, mid));root.right = buildTree(Arrays.copyOfRange(preorder, mid + 1, preorder.length), Arrays.copyOfRange(inorder, mid + 1, inorder.length));return root;}//437. 路径总和 IIIint res4 = 0;//从每个节点dfspublic int pathSum(TreeNode root, int targetSum) {if (root == null) return 0;//遍历每个节点 bfsQueue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {int n = queue.size();for (int i = 0; i < n; i++) {TreeNode cur = queue.poll();dfs4(cur, targetSum);if (cur.left != null) queue.add(cur.left);if (cur.right != null) queue.add(cur.right);}}return res4;}private void dfs4(TreeNode root, long curSum) {if (root != null) {curSum -= root.val;if (curSum == 0) {res4++;}//递归dfs4(root.left, curSum);dfs4(root.right, curSum);}}//236. 二叉树的最近公共祖先public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null || root == p || root == q) return root;TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if(left == null) return right;if(right == null) return left;return root;}//124. 二叉树中的最大路径和int res = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {dfs6(root);return res;}//计算root作为父结点所在在路径的最大路径和private int dfs6(TreeNode root) {if (root == null) return 0;//计算左子树的最大路径和,抛弃负数的路径int left = Math.max(0, dfs6(root.left));int right = Math.max(0, dfs6(root.right));//计算路径 left -> root -> right 的和res = Math.max(res, left + right + root.val);//返回root结点所在的子树最大路径和给父结点使用return root.val + Math.max(left, right);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix告警 邮件告警 钉钉告警

邮件告警添加主机组添加模板添加主机在模板中添加监控项在模板中添加触发器添加动作&#xff0c;远程执行命令给用户绑定告警媒介类型 钉钉告警安装python依赖模块python-requests配置钉钉告警配置脚本zabbix_ding.conf在目录/var/log/zabbix中创建钉钉告警日志文件zabbix_ding…

数据结构——散列表

参考书籍&#xff1a; 《数据结构与抽象&#xff1a;Java语言描述》 第四版 一、背景知识 散列&#xff08;hashing&#xff09;&#xff1a;是仅利用项的查找键&#xff0c;无需查找就可确定其下标的一项技术散列表&#xff08;hash table&#xff09;&#xff1a;数组散列索引…

Windos操作系统下的Zookeeper安装图文教程

凯哥已经准备好最新版本3.9.1且已经配置好了。既获取到配置好的。 获取到凯哥准备的安装后&#xff0c;只需要修改一下配置。将解压包解压后&#xff0c;找到conf文件&#xff0c;里面有个zoo.cfg配置文件。如下图&#xff1a; 下载后conf文件夹内容 打开zoo.cfg配置文件后&a…

MQTT 资源

MQTT因其轻量化、便利化得到广泛重视和应用&#xff0c;本着寻求低投入高产出的原则&#xff0c;要寻求免费的MQTT Broker(Server)变得重要起来。 1.Dfrobot的easy-iot物联网平台&#xff0c;网址&#xff1a;. http://iot.dfrobot.com.cn/ 需要在线注册&#xff0c;免费享有…

手把手教你如何白瓢七个月阿里云云服务器

白嫖他不爽吗&#xff1f; 手把手带你白嫖七个月云服务器&#xff0c;要注意奥&#xff0c;这里白嫖七个月需要学生认证&#xff0c;才能参与高校计划。 开搞&#xff1a; 阿里云官网  不必多说&#xff0c;直接登录&#xff0c;登录时需要用支付宝扫码&#xff0c;授权后即可…

vscode使用插件KoroFileHeader添加注释

一、简介 KoroFileHeader 是一款用于在 VSCode 中用于生成文件头部注释和函数注释的插件&#xff0c;支持所有主流语言&#xff0c;功能强大&#xff0c;灵活方便&#xff0c;文档齐全。 VSCode 安装 KoroFileHeader 好插件&#xff0c;就可以直接使用。 "fileheader.cu…

wpf prism当中 发布订阅 IEventAggregator

先订阅后发布 private readonly IEventAggregator _eventAggregator; public LoginViewModel(ILoginService iloginService, IEventAggregator eventAggregator) {_iloginService iloginService;_eventAggregator eventAggregator;_eventAggregator.GetEvent<MessageEven…

JVM入门

1. JVM简介 * JVM是Java虚拟机&#xff0c;是Java应用程序运行的平台。 * JVM可以跨平台运行&#xff0c;因为Java源代码会被编译成平台无关的字节码。 * JVM由Java虚拟机规范&#xff08;Java Virtual Machine Specification&#xff09;定义。 2. JVM架构 * JV…

JavaScript(基本介绍+特点+主要用途)

JavaScript&#xff08;简称 JS&#xff09;是一种高级的、面向对象的编程语言&#xff0c;主要用于在网页上实现动态交互效果。作为一种脚本语言&#xff0c;JavaScript 被设计用来与网页交互&#xff0c;能够在用户浏览器中执行&#xff0c;改变网页的内容、结构和样式。Java…

OpenAI政变背后是科学家创始人的悲歌

OpenAI政变背后是科学家创始人的悲歌 去年11月突然推出ChatGPT震惊世界的OpenAI&#xff0c;在整整一年后以闪电解职CEO再次震惊世界。 有不少人以为这拿的是乔布斯的剧本&#xff0c;错了&#xff0c;这其实是天才科学家奋力一击的故事。 OpenAI的灵魂人物不是CEO Sam Al…

每天分享五款工具,让大家工作生活更顺心

​ 快乐不是在于拥有什么,而在于我们和别人分享什么。每天分享五款工具&#xff0c;让大家工作办公更顺心就是我最大的快乐。 1.沙盒软件——Sandboxie ​ Sandboxie是一款可以在沙盒中运行程序的软件&#xff0c;它可以保护用户的系统和数据免受恶意软件、病毒和其他威胁的影…

零基础想系统地学习金融学、量化投资、数据分析、python,需要哪些课程、书籍?有哪些证书可以考?

曾经我也是零基础小白&#xff0c;题主想走的路&#xff0c;我已经走过啦&#xff5e;作为一名CFA持证人和管理因子投资的量化策略的投资组合经理&#xff0c;我把这些年积累的干货跟大家分享。 量化投资是金融学的一部分&#xff0c;量化投资&#xff08;跟量化交易的概念有部…

数据归一化的常见方法

线性函数归一化(最大最小值法) x ′ x − x m i n x m a x − x m i n x\frac {x-x_{min}}{x_{max}-x_{min}} x′xmax​−xmin​x−xmin​​ 数据区间在 [ 0 , 1 ] [0,1] [0,1]上,出现特殊值(极大或极小时,效果不好,可用经验值,代替 x m a x x_{max} xmax​和 x m i n x_{min…

鸿蒙原生应用/元服务开发-AGC分发如何配置版本信息(上)

1.配置HarmonyOS应用的“发布国家或地区”。 2.设置是否为开放式测试版本。 注意&#xff1a;HarmonyOS应用开放式测试当前仅支持手机、平板、智能手表。如开发者想发布为开放式测试版本&#xff0c;选择“是”。正式发布的版本请选择“否”。 3.在“软件版本”下点击“软件包…

el-table中添加switch 且绑定值为0和1

switch开关经常用在是否启用的场合&#xff0c;但是switch默认绑定值的类型是布尔类型&#xff0c;即true和false&#xff0c;在实际的项目中&#xff0c;后端的接口都会用0和1来代替&#xff0c;如何将数值与状态进行关联呢&#xff1f; 我们可以用active-value绑定要启用状态…

《活着》思维导图

今天给大家分享的这部作品的题目叫“活着”&#xff0c;作为一个词语&#xff0c;“活着”在我们中国的语言里充满了力量&#xff0c;它的力量不是来自于喊叫&#xff0c;也不是来自于进攻&#xff0c;而是忍受&#xff0c;去忍受生命赋予我们的责任&#xff0c;去忍受现实给予…

如何用html css js 画出曲线 或者斜线;

效果图 解题思路 将图片全部定位至中心点&#xff0c;然后x轴就变动translateX &#xff0c;y轴同理&#xff1b; 这里有两个问题 浏览器&#xff1a; 以左上角为原点0&#xff0c;0 越往下y越大 数学坐标系&#xff1a;以中心点为原点0&#xff0c;0 越往下y越小&#xff1…

广东网络广播电视台《明星小主播》栏目开拍 小主持神采奕奕

近日&#xff0c;由广东网络广播电视台的《明星小主播》栏目&#xff0c;在广东广播电视台&#xff08;人民北路&#xff09;广州越秀区人民北路686号主楼五楼火热开拍&#xff0c;幕后花絮曝光。《明星小主播》栏目是一档专业少儿主持类节目&#xff0c;节目旨在培养小朋友的主…

动态库符号抢占问题分析

背景 前段时间在北汽项目中&#xff0c;遇到了一个奇怪现象&#xff0c;困扰了大家较长时间。最终在和同事的不懈努力下&#xff0c;从根因上解决了该问题&#xff0c;过程中也学习到了很多。在此&#xff0c;记录并分享&#xff0c;希望能够帮助大家。 问题描述 作为OTA服务的…

【Pytorch】Visualization of Feature Maps(1)

学习参考来自 CNN可视化Convolutional Featureshttps://github.com/wmn7/ML_Practice/blob/master/2019_05_27/filter_visualizer.ipynb 文章目录 filter 的激活值 filter 的激活值 原理&#xff1a;找一张图片&#xff0c;使得某个 layer 的 filter 的激活值最大&#xff0c…