题目: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.
思路:
首先需要理解的是,不是当前左右节点的数值小于当前根节点就行,而是左子树所有的节点数值均小于根节点才可以。
最简单的方法就是递归判断左右子树的满足条件,对于第一个根节点,对于左子树,看下面所有的节点是否满足小于根节点数值,对于右子树,看下面所有节点是否满足所有节点大于根节点数值。
然后循环递归。
接下来两个解法是中序遍历。
最后一个是一个变型的中序遍历,但里面牵涉到为啥指向右边子树的问题,这是因为每次比较已经比较了左边的,而左子树的某一个下属节点的右子树却未必。
代码:
class Solution { public: bool isValidBST(TreeNode* root) { if(root==NULL) return true; return isSubTreeGreater(root->left,root->val)&&isSubTreeLess(root->right,root->val) &&isValidBST(root->left)&&isValidBST(root->right); //不是左节点小于根节点,右节点大于根节点即可,而是左子树所有节点全部小于当前根节点。对右子树一样。 //前面的两个函数是不断检测下面的节点的数值小于当前root顶点值。这能够保证下面的节点全部符合条件 //然后通过下面两个函数判断下面左右子树节点 } bool isSubTreeGreater(TreeNode* root,int val){ if(root==NULL) return true; return root->val<val&&isSubTreeGreater(root->left,val)&&isSubTreeGreater( root->right,val); } bool isSubTreeLess(TreeNode* root,int val){ if(root==NULL) return true; return root->val>val&&isSubTreeLess(root->left,val)&&isSubTreeLess( root->right,val); } }; /* class Solution2 { public: int ok=true,first=true; bool isValidBST(TreeNode* root) { int prev; travel(root,prev); return ok; } void travel(TreeNode* root,int &prev){ if(root==NULL) return; if(root->left) travel(root->left,prev); int mid=root->val; if(!first){ if(mid<=prev) ok=false; prev=mid;//mid 成为过去式 }else{ prev=mid; first=false; } if(root->right) travel(root->right,prev); } }; class Solution3 { public: bool isValidBST(TreeNode* root){ if(root==NULL||(root->left==NULL&&root->right==NULL)) return true; stack<TreeNode*>st; int prev=INT_MIN; bool first=true; while(!st.empty()||root!=NULL){ if(root!=NULL){ st.push(root); root=root->left; }else{ root=st.top();st.pop(); if(first||root->val>prev){ first=false; prev=root->val; }else{ return false; } root=root->right; } } return true; } }; class Solution4 { public: bool isValidBST(TreeNode* root) { if(!root) return true; if(root->left) { TreeNode* l = root->left; while(l){ if(l->val >= root->val) return false; l = l->right;//为什么指向右边,这是因为,在每一次最下面递归调用函数的时候,都已经比较了一次当前 //节点与root值得大小,下面同理。 } } if(root->right){ TreeNode* r = root->right; while(r) { if(r->val <= root->val) return false; r = r->left; } } return isValidBST(root->left)&&isValidBST(root->right); } }; */