LeetCode 98. Validate Binary Search Tree
方法一:Inorder Traversal
Binary Search Tree 的一个性质就是 inorder 遍历的时候是有序的。
这道题和 426. Convert Binary Search Tree to Sort Doubly Linked List 类似,需要一个 prev 指针记录前一个节点。非递归更好些,递归写可以把 prev 声明为全局变量,也可以引用传递作为 inorder 的参数。
这道题是非递归好写,随机应变。
Iterative:
class Solution { public: bool isValidBST(TreeNode* root) { if (root==NULL) return true; stack<TreeNode *> s; TreeNode *p=root, *prev=NULL; while (!s.empty() || p!=NULL){ while (p!=NULL){ s.push(p); p = p->left; } p = s.top(); s.pop(); if (!(prev==NULL || p->val>prev->val)) return false; prev = p; p = p->right; } return true; } };
Recursive:
class Solution { public: bool isValidBST(TreeNode* root) { TreeNode *prev=NULL; return inorder(root,prev); } bool inorder(TreeNode *root, TreeNode *&prev){ if (root==NULL) return true; if (!inorder(root->left,prev)) return false; if (!(prev==NULL || root->val>prev->val)) return false; prev = root; return inorder(root->right,prev); } };
方法二:DFS
利用 Binary Search Tree 的性质,设定一个下界low和上届high。递归时根据向左还是向右对应更新low或者high,判断BST的性质是否满足即可。
当然也可以非递归来写,递归更好些。
class Solution { public: bool isValidBST(TreeNode* root) { return dfs(root,LONG_MIN,LONG_MAX); } bool dfs(TreeNode *root, long low, long high){ if (root==NULL) return true; // low < root < high if (!(low<root->val && root->val<high)) return false; return (dfs(root->left,low,root->val) && dfs(root->right,root->val,high)) == true; } };
时间复杂度:O(n)

浙公网安备 33010602011771号