這道題之前也刷過,自己做了一遍,發現卡在了第70多個樣例,才發現自己沒有利用二叉搜索樹的性質,但凡涉及到二叉搜索樹,應該首先考慮中序遍歷!!!
被卡住的測試樣例是這樣的:
雖然每個左子樹和右子樹都是二叉搜索樹,但是沒有滿足右子樹中所有元素都大于根節點元素這一性質,所以還需要進一步考慮:如何才能保證左子樹的所有元素都小于當前根節點,右子樹的所有元素都大于根節點?
我們需要引入一個額外的全局變量,用一個指針pre
指向當前根節點的上一個遍歷節點(也就是其左子樹的最右下角的節點),將中序遍歷的結果放到一維數組中,該指針指向的實際上就是當前節點元素的前一個元素。我們需要判斷root
的值和pre
的值誰更大,如果pre -> val >= root -> val
,就說明排列出現了問題,不滿足二叉搜索樹的性質,直接返回false,否則將當前節點root
賦值給pre
。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* pre = nullptr;bool isValidBST(TreeNode* root) {//涉及二叉搜索樹要用中序遍歷!!!if(!root) return true; //遞歸終止條件//單層遞歸邏輯//左bool left_flag = isValidBST(root -> left); //中if(pre && pre -> val >= root -> val)return false;pre = root;//右bool right_flag = isValidBST(root -> right);return left_flag && right_flag;}
};