码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 255. Verify Preorder Sequence in Binary Search Tree

时间:2017-01-04 07:50:06      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:src   binary   lis   bool   大于   app   tor   tco   array   

验证一个list是不是一个BST的preorder traversal sequence。

技术分享

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?

 

观察这个例子: [8, 3, 1, 6, 4, 7, 10, 14, 13],

8, 3, 1 这三个连续递减的数说明从root开始我们一直在往左边走,直到出现6。

6应该是3的right child,因为他比3大,但是比8小。这时min这个指标应该等于3。也就是说之后list中的所有数都不能小于3。因为6是3的right child,说明3的本身和他的左子树已经遍历完毕,之后的所有数都应该比3大。

然后又是下降,直到出现7。这时应该将min更新为6。之后所有的数都应该大于6。以此类推。我们要做的是维护一个stack。如果elem < min, return False。如果elem < stack[-1], 把elem push进stack。如果elem > stack[-1], 那么pop出stack中比elem小的那些数字,并更新min。具体的步骤看:

min = -MaxInt

8,

8, 3,

8, 3, 1

8, 6    min = 3

8, 6, 4,

8, 7 min = 6

10, min = 8

14, min = 10

14, 13

 

 1 class Solution(object):
 2     def verifyPreorder(self, preorder):
 3         """
 4         :type preorder: List[int]
 5         :rtype: bool
 6         """
 7         stack = []
 8         min = -0x7FFFFFFF
 9         for elem in preorder:
10             if elem < min:
11                 return False
12             while stack and stack[-1] < elem:
13                 min = stack.pop()
14             stack.append(elem)
15         return True

 

Follow Up: 如何验证postorder和midorder?

A: 中序排列是递增数列。

postorder的顺序是left-right-root,那么这个例子应该是[1, 4, 7, 6, 3, 13, 14, 10, 8]

比较容易的方式是从root开始验证,由于后续root再后面,我们可以先把list reverse一下。然后思路和上面差不多,只不过要递减改为递增。记录min改成记录max。

 

Leetcode 255. Verify Preorder Sequence in Binary Search Tree

标签:src   binary   lis   bool   大于   app   tor   tco   array   

原文地址:http://www.cnblogs.com/lettuan/p/6247229.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!