LeetCode 98. Validate Binary Search Tree
阿新 • • 發佈:2017-05-09
follow tco helper pre strong keys png root 分享
原題
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node‘s key.
- The right subtree of a node contains only nodes with keys greater than the node‘s key.
- Both the left and right subtrees must also be binary search trees.
Example 1:
2 / 1 3Binary tree
[2,1,3]
, return true.
Example 2:
1 / 2 3Binary tree
[1,2,3]
, return false.
解題思路
思路一:
- 先將二叉樹進行中序遍歷,接著判斷遍歷的數據是否為遞增的即可(較簡單)
思路二:
- 采用二叉搜索樹的定義來解題(較難)
- 難點:每個節點都得跟兩個數進行比較,它必須在這兩個數的範圍之內,其中一個是它的父節點,另外一個是它的某個祖先節點
- 這個樹是從上往下遍歷的,遍歷到每個節點時,都要把它限定在一個已知的範圍內,不管他下面的節點,只根據他上面的節點來找出這個範圍
- 這裏我采用繼承的方法,首先定義根節點的範圍為正負無窮大,節點每一個左節點的最大值為它的父節點,最小值繼承它父節點的最小值(右節點相似),由此就可以構造出一個遞歸程序。
完整代碼
思路一
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None # 先將二叉搜索樹進行中序遍歷,接著判斷是否滿足規則 class Solution(object): def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """ self.ret = [] self.helper(root) for i in xrange(1, len(self.ret)): if self.ret[i] <= self.ret[i-1]: return False return True def helper(self, node): if node == None: return self.helper(node.left) self.ret.append(node.val) self.helper(node.right)
思路二
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """ return self.helper(root, -float("inf"), float("inf")) def helper(self, node, low, high): if node == None: return True if node.val <= low or node.val >= high: return False return self.helper(node.left, low, node.val) and self.helper(node.right, node.val, high)
LeetCode 98. Validate Binary Search Tree