Verify preorder sequence of Binary Search Tree

要点:simulating preorder sequence:

  • 根据preorder的特点,首先会一直向left subtree方向访问,并且值递减。当遇到一个非递减元素是,说明这个是某个当前路径上结点作为根的right subtree上的点。
  • 首先我们要找到这个根结点:如果之前把所有元素都存到stack里,stack按pop顺序是从小到大的,不断pop,最后一个小于当前元素的结点即为root(记法:因为不断更新low,所以root.val最终在low里)。另外xstack[-1]就停了,也就是把作为right subtree处理。
  • invalid:pop出来的以后,序列都要更大:因为不断向右子树方向走(parent的root已经访问过),low是不断变大的。下一个low可能往父节点走,也可能继续右子树。之后的结点必须大于low,否则invalid

https://repl.it/CfR8/1

错误点:注意[9,5,7,8]这是valid的,如果把8放在root 9右边当然不符合,但是也可以放到7右边,preorder并不是唯一的。

recursion approach

  • based on: preorder序列的第一个点把值域分割:所以很容易adapt到top-down approach
  • recursion:每层loop:根据中点値找到left/right tree的交接点:这样可以recurse到left/right subtree
    • loop中验证subtree的值不能超过上层pass下来的区间
    • redundant: loop中的验证重复进行多次

https://tonycao.gitbooks.io/leetcode-locked/content/LeetCode Locked/c1.14.html

O(1): 要点是重用当前sequence:因为stack的size不会超过当前遍历的元素。用global i来记录stack top的位置即可,所以用sequence的[0,i]来存stack。

错误点:注意i表示当前栈顶,那么初始化为-1。

https://repl.it/Cf1t

# Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.

# You may assume each number in the sequence is unique.

# Follow up:
# Could you do it using only constant space complexity? # Hide Company Tags Zenefits
# Hide Tags Tree Stack
# Hide Similar Problems (M) Binary Tree Preorder Traversal class Solution(object):
def verifyPreorder(self, preorder):
"""
:type preorder: List[int]
:rtype: bool
"""
low = -sys.maxint
stk = []
for p in preorder:
if p<low:
return False while stk and p>stk[-1]:
low = stk.pop() stk.append(p)
return True
import sys
class Solution:
# @param {integer[]} preorder
# @return {boolean}
def verifyPreorder(self, preorder):
low = -sys.maxint
i = -1
for x in preorder:
if x < low:
return False
while i>=0 and x>preorder[i]:
low = preorder[i]
i-=1
i+=1
preorder[i]=x
return True sol = Solution()
print sol.verifyPreorder([2, 4, 1])
print sol.verifyPreorder([40, 30, 35, 80, 100])
print sol.verifyPreorder([40, 30, 35, 20, 80, 100])

边工作边刷题:70天一遍leetcode: day 84-1的更多相关文章

  1. 边工作边刷题:70天一遍leetcode: day 84

    Flatten 2D Vector 要点: 这题是2d的iterator,一般对于1d的情况,hasNext()是不需要做移动的.而2d不同,core iterator是j向的,而i向要在hasNex ...

  2. 边工作边刷题:70天一遍leetcode: day 89

    Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...

  3. 边工作边刷题:70天一遍leetcode: day 77

    Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...

  4. 边工作边刷题:70天一遍leetcode: day 78

    Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...

  5. 边工作边刷题:70天一遍leetcode: day 85-3

    Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...

  6. 边工作边刷题:70天一遍leetcode: day 101

    dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...

  7. 边工作边刷题:70天一遍leetcode: day 1

    (今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...

  8. 边工作边刷题:70天一遍leetcode: day 70

    Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...

  9. 边工作边刷题:70天一遍leetcode: day 71-3

    Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...

  10. 边工作边刷题:70天一遍leetcode: day 71-2

    One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...

随机推荐

  1. android 学习资料

    Fragment 事件分发机制 事件分发机制2 NDK JNI ndk { moduleName "mymodule" ldLibs "log" stl &qu ...

  2. MyEclipse8.6安装SVN 教程 与遇到的问题

    按网上的多种方式都不好用     最后这种好用 了! 写此文做记录. MyEclipse版本:8.6 SVN版本:1.6.9 MyEclipse版本要对应SVN版本.否则会出错. 教程: 1.下载最新 ...

  3. HTML中行内元素的竖直方向的padding和margin是否真的无效

    参考资料:Inline elements and padding 今天写一个导航栏时遇到了一个问题:行内元素的padding-top,padding-bottom和margin-top,margin- ...

  4. VisualStudio中解决方案

    在VS中创建一个项目通常会生成一个解决方案文件(.sln)和一个隐藏的解决方案用户选项文件(.suo). 解决方案文件是一个文本文件,包含以下信息: 将被加载的所有项目以构成完整解决方案的项目清单 解 ...

  5. ArcGIS制图之Maplex自动点抽稀

    制图工作中,大量密集点显示是最常遇到的问题.其特点是分布可能不均匀.数据点比较密集,容易造成空间上的重叠,影响制图美观.那么,如果美观而详细的显示制图呢? 主要原理 Maplex中对标注有很好的显示控 ...

  6. andriod arcgis加载影像TIF

    private static final String TAG = "MainActivity"; private MapView mapView = null; @Overrid ...

  7. SharePoint 2010 文档管理系列之星级评论功能

    前言:正如我们前面介绍的是,文档管理就是让大家更加直观.方便的对手里的文档,进行统筹掌控,哪些文档是有价值的,哪些文档更受大家欢迎,所有就带来了这个星级评论. 当然,这个是SharePoint 201 ...

  8. MVC中的CSRF解决方案

    我们使用Ajax访问请求的时候,攻击者可能盗用了用户身份,以用户合法身份发送恶意请求. 具体预防措施, 1.在Html表单里面使用@Html.AntiForgeryToken(),这玩意会生成一对加密 ...

  9. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q97-Q99)

    04 }Which code segment should you add at line 03?A. currentItem["ClassificationMetadata"] ...

  10. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q25-Q27)

    Question25You develop a new publishing page layout named MyPage.aspx for a SharePoint site.You creat ...