算法-二叉树:验证二叉搜索树
题目描述:
- 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值。
- 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值。
- 它的左右子树也分别是二叉搜索树。
方法一:使用中序遍历将二叉搜索树存入数组,判断数组是不是有序的即可。
void traversal(TreeNode* root,vector<int>& nums){
if(root == NULL ) return ;
traversal(root->left,nums);
nums.push_back(root->val);
traversal(root->right,nums);
}
bool isBST(TreeNode* root){
vector<int> nums;
traversal(root, nums);
for(int i = 1; i < nums.size(); i++){
if(nums[i] <= nums[i-1])
return false;
}
return true;
}
方法二:使用递归,在中序遍历的时候就判断,定义一个pre指向前一个节点,root指向当前节点。
TreeNode* pre = NULL;//初始化前一个节点为NULL
bool isBST(TreeNode* root){
if(root == NULL) return false;
bool left = isBST(root->left); // 左
if(!pre && pre->val>=root->val){
return false;
}
pre = root;//记录前一个节点。不用处理root,因为递归时的root会被替换成root->left或right,记住这是递归!!!
bool right = isBST(root->right);//右
return left && right;
}
方法三:迭代法,对中序迭代法稍加改动。
bool isBST(TreeNode* root){
if(root == NULL) return false;
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = NULL;//改动
while (!st.empty() || !cur) {
if(!cur){//左
st.push(cur);
cur = cur->left;
}
else{
cur = st.top();//中
st.pop();
if(pre!=NULL && pre->val >= cur->val) {//改动
return false;
}
cur = cur->right;//右
}
}
return true;
}