[LeetCode]98.Validate Binary Search Tree,binarysearchtree
【題目】
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.
confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.
【分析】
無
【代碼】
/********************************** 日期:2014-12-27* 作者:SJF0115* 題目: 98.Validate Binary Search Tree* 來源:https://oj.leetcode.com/problems/validate-binary-search-tree/* 結果:AC* 來源:LeetCode* 總結:**********************************/#include <iostream>#include <climits>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {public: bool isValidBST(TreeNode *root) { if(root == NULL){ return true; }//if return isValidBST(root,INT_MIN,INT_MAX,false,false); }private: bool isValidBST(TreeNode* node,long min,long max,bool validMin,bool validMax){ if(node == NULL){ return true; } // min max第一次不要使用 // 根節點大於左子樹所有節點 小於右子樹所有節點 if((validMax && node->val >= max) || (validMin && node->val <= min)){ return false; } // 左子樹是否滿足 bool left = isValidBST(node->left,min,node->val,validMin,true); // 右子樹是否滿足 bool right = isValidBST(node->right,node->val,max,true,validMax); return left && right; }//};//按先序序列建立二叉樹int CreateBTree(TreeNode*& T){ int data; //按先序次序輸入二叉樹中結點的值,-1表示空樹 cin>>data; if(data == -1){ T = NULL; } else{ T = new TreeNode(data); //構造左子樹 CreateBTree(T->left); //構造右子樹 CreateBTree(T->right); } return 0;}int main() { Solution solution; TreeNode* root = NULL; CreateBTree(root); cout<<solution.isValidBST(root)<<endl;}
【錯解】
class Solution {public: bool isValidBST(TreeNode *root) { if(root == NULL){ return true; }//if // 左子樹 if(root->left){ if(root->left->val >= root->val){ return false; }//if }//if // 右子樹 if(root->right){ if(root->right->val <= root->val){ return false; }//if }//if bool left = isValidBST(root->left); bool right = isValidBST(root->right); return left && right; }};
10
/ \
5 15
/ \
6 20
該演算法只考慮了一個根節點一個右節點一個左節點的比較,忘記了左子節點要小於父節點,小於父節點的父節點。。。。。。
右子節點要大於父節點,大於父節點的父節點。。。。。。
【錯解二】
class Solution {public: bool isValidBST(TreeNode *root) { if(root == NULL){ return true; }//if return isValidBST(root,INT_MIN,INT_MAX); }private: bool isValidBST(TreeNode* node,int min,int max){ if(node == NULL){ return true; }// if(node->val >= max || node->val <= min){ return false; }//if bool left = isValidBST(node->left,min,node->val); bool right = isValidBST(node->right,node->val,max); return left && right; }//};
如果節點值等於INT邊界值時就會出現問題