1. 程式人生 > >LeetCode98 樹·驗證二叉搜索樹(C++)

LeetCode98 樹·驗證二叉搜索樹(C++)

leet 必須 遞歸實現 str 遞歸 root size 初始 最大

題目描述:

給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。

假設一個二叉搜索樹具有如下特征:

  • 節點的左子樹只包含小於當前節點的數。
  • 節點的右子樹只包含大於當前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜索樹。

示例 1:

輸入:
    2
   /   1   3
輸出: true

示例 2:

輸入:
    5
   /   1   4
     /     3   6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
     根節點的值為 5 ,但是其右子節點值為 4 。






/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 
*/ /* 算法思想:由於二叉搜索樹的性質,對其進行中序遍歷為遞增序列。故而,先對樹進行中序遍歷,將結點值存入向量中,然後判斷判斷向量元素是否遞增即可。此處,中序遍歷采用非遞歸實現。 值得註意的是,題目設定為左<根<右,那麽就可以用中序遍歷來做。但是測試用例裏有左<=根<=右的情況,所以不能用上述方法做,理由如下:例如 [1,null,1] 與 [1,1] 它們遍歷得出的結果一樣,但第一個為BST,第二個不是。 故,利用它本身的性質來做,即左<根<右,初始化時帶入系統最大值和最小值,在遞歸過程中換成它們自己的節點值,用long代替int就是為了包括int的邊界條件。
*/ class Solution { public: /*bool isValidBST(TreeNode* root) { vector<int>res; stack<TreeNode*>s; TreeNode*p=root; if(root==NULL||(root->left==NULL&&root->right==NULL)) //若為空樹或者只有一個根節點結點 return true; while(p||s.empty()!=NULL){ while(p){ s.push(p); //將根節點 p=p->left; //轉到右子樹 } p=s.top(); //取出根節點 s.pop(); res.push_back(p->val); p=p->right; } for(int i=0;i<res.size();++i){ if(res[i]>=res[i+1]) return false; } return true; }
*/ bool isValidBST(TreeNode *root) { return isValidBST(root, LONG_MIN, LONG_MAX); } bool isValidBST(TreeNode *root, long mn, long mx) { if (!root) return true; if (root->val <= mn || root->val >= mx) return false; return isValidBST(root->left, mn, root->val) && isValidBST(root->right, root->val, mx); } };

LeetCode98 樹·驗證二叉搜索樹(C++)