LeetCode 98. Validate Binary Search Tree( 遞歸,BST )
- 2020 年 2 月 14 日
- 筆記
題意:判斷一個二叉樹是否為 二叉搜索樹BST
題解:所有思路都是去找二叉樹中不滿足BST性質的節點,找到了,就不符合,找不到就符合。那麼怎麼去找呢?我提供兩種思想。
第一個是,BST的中序遍歷是一個有序數組,所以把BST 中序遍歷的結果拿出來,看看是不是有序的就可以了。很簡單。那如果不讓你用額外的空間呢?那就在中序遍歷的過程中,判斷是不是有序。我們維護一個值last,這個值是遍曆數組的前一個元素,如果發現有當前元素小於前一個元素,就是false
第二個思路是,判斷每個節點是否符合區間。這種方法隨便哪種遍歷都可以。根節點的區間,是沒有限制的,Int.Min ~ Int.Max。那麼左子節點就是Int.Min ~ root->val ,那麼左子節點的右子節點,就是root->left->val,root->val。綜上所述,每遍歷到一個節點時,它的區間的最小值或者最大值都要變成它父親節點的值,這取決於左子樹還是右子樹。
這道題目的坑點是,數據範圍是 -(1<<31) ~ (1<<31)-1 ,就是int的邊界值。
解法一:
int father = -1*(1<<31); int tag=-1; bool isValidBST(TreeNode* root) { if(root==NULL) return true; if(isValidBST(root->left)) { if(root->val>father||(tag==-1&&root->val==father)) { father = root->val; tag=1; return isValidBST(root->right); } } return false; }
第二種
/** * Definition for a binary tree node. * 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; return fun(root,NULL,NULL); } bool fun(TreeNode* root,TreeNode* min,TreeNode* max) { if(root->left!=NULL) { if(!fun(root->left,min,root)) return false; } if(root->right!=NULL) { if(!fun(root->right,root,max)) return false; } if(((min!=NULL&&root->val>min->val)||(min==NULL)) &&( (max!=NULL&&root->val<max->val )||(max==NULL))) return true; else return false; } };