标签:span 考题 == 算法实现 mic amp ali pop pre
二叉搜索树是这样的二叉树,树中所有结点满足:左子树所有结点值小于根结点,右子树所有结点值大于根结点。
首先想到的是使用递归方法,如果满足前驱结点 < 根结点 < 后继结点,那么继续向下分别对左右子树进行递归,直到有不满足的情况出现,则返回false。还有一种递归想法(参考题解)是为每个子树设置(low, upper),判断根节点值root是否在区间内,然后对左右子树递归判断,左子树区间设置为(low,root-1),右子树为(root+1,upper),并且该方法可以很容易转化为栈实现,具体参考https://leetcode-cn.com/problems/validate-binary-search-tree/solution/yan-zheng-er-cha-sou-suo-shu-by-leetcode/。
下面是第一种递归算法实现
bool isValidBST(TreeNode* root) {
if(root == NULL) return true;
TreeNode* pre = root->left;
TreeNode* follow = root->right;
if(pre == NULL && follow == NULL)
return true;
if(pre == NULL){
while(follow->left) follow = follow->left;
if(isValidBST(root->right) && root->val < follow->val)
return true;
return false;
}
if(follow == NULL){
while(pre->right) pre = pre->right;
if(isValidBST(root->left) && root->val > pre->val)
return true;
return false;
}
while(follow->left) follow = follow->left;
while(pre->right) pre = pre->right;
if(isValidBST(root->left) && isValidBST(root->right) && root->val < follow->val && root->val > pre->val)
return true;
return false;
}
还有一种常见的方法是对二叉树进行中序遍历,根据搜索树的性质可知,中序遍历的序列是递增的。下面使用栈方法进行中序遍历验证二叉搜索树(也可使用递归遍历或莫里斯遍历)。
bool isValidBST(TreeNode* root) {
vector<TreeNode*> stk;
TreeNode* cur = root;
long before = (long)INT_MIN - 1;
while(cur != NULL || stk.size() != 0){
while(cur != NULL){
stk.push_back(cur);
cur = cur->left;
}
cur = stk.back();
stk.pop_back();
if(cur->val <= before) return false;
before = cur->val;
cur = cur->right;
}
return true;
}
标签:span 考题 == 算法实现 mic amp ali pop pre
原文地址:https://www.cnblogs.com/zz-zhang/p/12312897.html