1. 程式人生 > >lintcode validate-binary-search-tree 驗證二叉查詢樹

lintcode validate-binary-search-tree 驗證二叉查詢樹

問題描述

筆記

  • 程式碼1是用到中序遍歷,要求中序遍歷是嚴格的增序。用到了輔助空間。
  • 程式碼2是leetcode上面的解法,用到了prev指標記錄前一個節點,省下了輔助空間,而且要注意prev傳進去還應該是引用。

程式碼1

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution { public: /** * @param root: The root of binary tree. * @return: True if the binary tree is BST, or false */ bool isValidBST(TreeNode *root) { // write your code here vector<int> res; res.clear(); Inorder(root, res); if
(res.empty() || res.size() == 1) return true; for (int i = 0; i < res.size() - 1; i++) { if (res[i] >= res[i+1]) return false; } return true; } void Inorder(TreeNode *root, vector<int> &res) { if
(root == NULL) return; Inorder(root->left, res); res.push_back(root->val); Inorder(root->right, res); } };

程式碼2

/**
 * 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) 
    {
        TreeNode *pre = NULL;
        return validate(root, pre);
    }

    bool validate(TreeNode *root, TreeNode *&pre)
    {
        if (root == NULL)
            return true;
        if (!validate(root->left, pre))
            return false;
        if (pre != NULL && pre->val >= root->val)// 如果當前還是NULL那就先不管吧,繼續往下執行。
            return false;
        pre = root;
        return validate(root->right, pre);
    }
};