1. 程式人生 > >leetcode刷題日記之驗證二叉搜尋樹

leetcode刷題日記之驗證二叉搜尋樹

題目:

給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。

一個二叉搜尋樹有如下定義:

左子樹只包含小於當前節點的數。
右子樹只包含大於當前節點的數。
所有子樹自身必須也是二叉搜尋樹。

示例 1:

2
/ \
1 3

二叉樹[2,1,3], 返回 true.

示例 2:

1
/ \
2 3

二叉樹 [1,2,3], 返回 false.

解題思路:二叉搜尋樹中序遍歷之後是一個有序序列。所以借用此性質,先中序遍歷該二叉搜尋樹,然後判斷該序列是否有序即可。

c++解法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution { public: bool isValidBST(TreeNode* root) { vector<int> v; inOrder(root, v); for (int i = 1; i < v.size(); i ++){ if (v[i - 1] >= v[i]) return false; } return true; } private: void inOrder(TreeNode* root, vector
<int>
&v){//中序遍歷 if (root != NULL){ inOrder(root->left, v); v.push_back(root->val); inOrder(root->right, v); } } };

python解法

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
# self.left = None # self.right = None class Solution: def inOrder(self, root, arr): if root: self.inOrder(root.left, arr) arr += [root.val] self.inOrder(root.right, arr) def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """ arr = [] self.inOrder(root, arr) for i in range(1, len(arr)): if arr[i-1] >= arr[i]: return False return True