热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法:树

树的最大路径和https:leetcode-cn.comproblemsbinary-tree-maximum-path-sum思路:递归遍历最大路径和按照一个

树的最大路径和

https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
思路:
递归+遍历

最大路径和

按照一个树 比如【a,b,c】 实际是三选一问题:b+root 与c+root 或者 b+c+root
maxSum 用于更新最大和,treeMaxSum

int maxSum= Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {treeMaxSum(root);return maxSum;}public int treeMaxSum(TreeNode root){if (root==null) return 0;int left=Math.max(0,treeMaxSum(root.left));int right=Math.max(0,treeMaxSum(root.right));int tempMax=Math.max(left,right);tempMax=Math.max(tempMax,left+right);maxSum= Math.max(maxSum,tempMax+root.val);return Math.max(left,right)+root.val;}

根据前序 中序遍历结果还原二叉树

https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

思路:
遍历 + 递归

前序:根左右
中序:左根右
根据中序遍历 可以分出左子树与右子树, 记录根的下标记 rootIndex,左子树个数为rootIndex 前的个数leftNum,从而知道前序遍历中的start+leftNum+1开始是左子树,后面的全部是右子树。递归调用

public TreeNode buildTree(int[] preorder, int[] inorder) {return buildTree(preorder, 0, preorder.length , inorder, 0, inorder.length );}public TreeNode buildTree(int[] preorder, int p_start, int p_end,int[] inorder, int i_start, int i_end) {if (p_start &#61;&#61; p_end) {return null;}TreeNode treeNode &#61; new TreeNode(preorder[p_start]);int rootIndex &#61; 0;for (int i &#61; i_start; i < i_end; i&#43;&#43;) {if (inorder[i] &#61;&#61; preorder[p_start]) {rootIndex &#61; i;}}int leftNum &#61; rootIndex - i_start;treeNode.left &#61; buildTree(preorder, p_start&#43;1, p_start &#43;1&#43; leftNum , inorder, i_start, rootIndex );treeNode.right &#61; buildTree(preorder, p_start &#43;1&#43; leftNum, p_end, inorder, rootIndex &#43; 1, i_end);return treeNode;}

树按层遍历&#xff08;BFS&#xff09;

规律&#xff1a; 利用队列 &#xff0c;看作图的遍历
扩展&#xff1a; 可以求深度

public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> list &#61; new ArrayList<>();if (root&#61;&#61;null) return list;Deque<TreeNode> queue &#61; new ArrayDeque<>();queue.add(root);while (!queue.isEmpty()) {int size &#61; queue.size();List<Integer> levelResult &#61; new ArrayList<>();for (int i &#61; 0; i < size; i&#43;&#43;) {TreeNode cur &#61; queue.poll();levelResult.add(cur.val);if (cur.left !&#61; null) {queue.add(cur.left);}if (cur.right !&#61; null) {queue.add(cur.right);}}list.add(levelResult);}return list;}

树按深度遍历

非递归&#xff0c;利用栈实现

//深度优先遍历List<TreeNode> treeList ;public List<TreeNode> dfs(TreeNode root) {treeList &#61; new ArrayList<>();if(root&#61;&#61;null) {return null;}Stack<TreeNode> myStack&#61;new Stack<>();myStack.add(root);while(!myStack.isEmpty()) {TreeNode node&#61;myStack.pop(); //弹出栈顶元素//System.out.print(node.value&#43;" ");treeList.add(node);//向栈中先压入右子树&#xff0c;在压入左子树。这样出栈时&#xff0c;先出左子树再出右子树.也就是,先遍历左边&#xff0c;后遍历右边if(node.right!&#61;null) {myStack.push(node.right);}if(node.left!&#61;null) {myStack.push(node.left);}}return treeList;}

递归

List<TreeNode> treeNodeList &#61; new ArrayList<>();;public List<TreeNode> dfsRec(TreeNode root) {if (root &#61;&#61; null) {return null;}treeNodeList.add(root);//System.out.print(root.value&#43;" ");dfsRec(root.left);dfsRec(root.right);return treeNodeList;}


推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
author-avatar
丁军东建宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有