Given a binary tree, determine if it is a valid binary search tree (BST).node
Assume a BST is defined as follows:less
這道題須要知道一個二叉搜索樹的特性,就是一個二叉搜索數的中序遍歷結果是一個嚴格單調遞增序列。在知道了這個性質以後,就很好解了,這裏咱們給出非遞歸和遞歸兩種解法。函數
非遞歸:post
/** * 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) { return true; } inOrder(root); for (int i = 1; i < v.size(); ++i) { if (v[i] <= v[i-1]) { return false; } } return true; } void inOrder(TreeNode* node) { if (!node) { return; } inOrder(node->left); v.push_back(node->val); inOrder(node->right); } private: vector<int> v; };
用了一個額外的vector存儲中序遍歷的結果,看上去好像不是太理想,再看一下遞歸方法:spa
/** * 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 = nullptr; return isValidBST(root, pre); } bool isValidBST(TreeNode *node, TreeNode*& pre) { if (!node) { return true; } if (!isValidBST(node->left, pre)) { return false; } if (pre && node->val <= pre->val) { return false; } pre = node; return isValidBST(node->right, pre); } };
代碼簡單了不少,其實遍歷的時候仍是按照中序的思路來的,可是因爲pre指針在函數間傳遞的過程中指向的位置會發生改變,所以須要注意在函數參數那裏須要將其寫爲指針的引用。指針