题目

Given an integer array with no duplicates. A max tree building on this array is defined as follow:

The root is the maximum number in the array
The left subtree and right subtree are the max trees of the subarray divided by the root number.
Construct the max tree by the given array.

此题和Construct Binary Tree from Preorder and Inorder Traversal 很类似, 所以第一反应使用递归做。递归的解法过不了lintcode,会显示超时:

class Solution:"""@param: A: Given an integer array with no duplicates.@return: The root of max tree."""def maxTree(self, A):def helper(A, start, end):if start > end:return Noneelif start == end:return TreeNode(A[start])maxVal = 0maxIndex = -1for i in range(start, end+1):if A[i] > maxVal:maxVal, maxIndex = A[i], iroot = TreeNode(maxVal)root.left = helper(A, start, maxIndex - 1)root.right = helper(A, maxIndex + 1, end)return rootif A is None or len(A) == 0:return Nonereturn helper(A, 0, len(A)-1)

比递归的更好的方法是用stack,比较难想到,代码参考了:https://lefttree.gitbooks.io/...

思路是用一个单调递减栈寻找最大值。每遍历到一个新的数字A[i],我们就把比这个数字小的都弹栈,直到剩下比此数字大的数字。这个操作可以帮我们顺利找到左子树父节点。这个解法让我想到了经典的树的非递归遍历,需要再复习一下。

class Solution:"""@param: A: Given an integer array with no duplicates.@return: The root of max tree."""def maxTree(self, A):stack = []for val in A:node = TreeNode(val)while len(stack) > 0 and val > stack[-1].val:node.left = stack.pop()if len(stack) > 0:stack[-1].right = nodestack.append(node)return stack[0]

LintCode: Max Tree相关推荐

  1. LintCode: Binary Tree Inorder Traversal

    C++,递归,辅助函数 1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int val; 6 * Tree ...

  2. 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连

    解析 max ksubarray sum:  最大和 of 连续子序列 =>   最大和 of  k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff:  无queu ...

  3. spoj 375 Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 题意: 给一颗树,每条边有一个权值.有两种操作: 1.修改某条边的值: 2.询问a.b两点路径上边权的最大值. 分析 ...

  4. BZOJ4066:简单题(K-D Tree)

    Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 将格 ...

  5. BZOJ4520:[CQOI2016]K远点对(K-D Tree)

    Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...

  6. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  7. 山东理工大学第十二届ACM程序设计竞赛 - Cut the tree(树上启发式合并+线段树)

    题目链接:点击查看 题目大意:给一个具有 N 个节点的有根树,以 1 号节点为根,节点编号从 1 开始,点有点权.树的第 H 层权值为深度为 H 的所有点的点权之和.树的总权值为所有层权值的最大值.问 ...

  8. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  9. SPOJ - QTREE Query on a tree(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵由n个点组成的树,再给出数个操作,每次操作分为下列几种类型: QUERY x y:询问点x-点y这条路径上的所有边权的最大值 CHANGE x y:将第x条边的权 ...

最新文章

  1. centos 8 卸载anaconda_Centos7安装JDK1.8
  2. 自定义View之onMeasure()
  3. 互联网晚报 | 11月21日 星期日 | B站公布《三体》动画首个预告片;涪陵榨菜回应天价礼盒;农行个人贷款余额突破7万亿元...
  4. VScode使用gitbash的配置方法
  5. 物流车辆数据在金融科技的应用
  6. 如何解决“本地编辑,更新时传入删除”消息
  7. oracle存储过程可以回退吗,Navicat 运行 Oracle 存储过程示例
  8. shell学习之定时运行作业
  9. python测量 检测软件_pytest首页、文档和下载 - Python 测试工具 - OSCHINA - 中文开源技术交流社区...
  10. MATLAB语音信号处理系统GUI
  11. 电脑一会,电脑一会黑屏一会正常怎么回事
  12. 机器学习--KNN算法应用,iris鸢尾花数据集的分类
  13. jvm(一.基础入门)
  14. 帝国时代III亚洲王朝序列号自动输入器
  15. LaTeX in 24 Hours - 3. Formatting Texts I
  16. nvaicat 下载加破解教程
  17. 离散数学-集合论-函数(10)
  18. java的web项目分工_JavaWeb中Servlet和JSP的分工案例
  19. EMP_常见问题及解决
  20. 正态分布/卡方分布/F分布/T分布

热门文章

  1. 银行的双重生物识别实验,是双重麻烦还是双重安全?
  2. 百度开源业内首个口罩人脸检测及分类模型,携手开发者共同抗疫
  3. 多任务学习,如何设计一个更好的参数共享机制?| AAAI 2020
  4. 机器学习基础-数据降维
  5. Facebook参与AI芯片设计大混战!
  6. 从AI技术到用户需求:深思考CEO杨志明谈创业心得
  7. 从“诺奖级”成果到“非主观造假”,时隔6年,韩春雨带着原一作,再发高分文章!...
  8. 德克萨斯AM大学的一项新技术可以让我们通过触摸屏「感受」物体
  9. 光遗传学离诺奖又双叒进一步!10天后谜底将揭晓 (盘点光遗传学近年来获奖记录)...
  10. 百度李彦宏:无人驾驶何时商用