98. 验证二叉搜索树¶
难度:中等
题目¶
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
题解¶
基本思路: 将二叉查找树中序展开为链表,判断链表是否是有序的。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct ListNode *insert(struct ListNode *List, int val)
{
struct ListNode *ret = malloc(sizeof(struct ListNode));
ret->val = val;
ret->next = List;
return ret;
}
struct ListNode *toList(struct TreeNode *root, struct ListNode *List)
{
if (root == NULL)
return List;
List = toList(root->right, List);
List = insert(List, root->val);
List = toList(root->left, List);
return List;
}
bool isValidBST(struct TreeNode* root){
if (root == NULL)
return true;
struct ListNode *rec = toList(root, NULL), *cur = rec;
do
{
if (cur->next == NULL)
break;
if (cur->val >= cur->next->val)
return false;
cur = cur->next;
}
while (true);
return true;
}