题目:Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
思路1:每个节点检查:1.所有左节点是否都小于当前节点。
2.所有右节点是否都大于当前节点。
分析:这种解法有个很明显的弊端,就是做了很多重复的计算,复杂度为o(n^2),效率比较低。
完成时间:40分钟
以下是AC代码:
/** * Definition for binary tree * 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 isLessThan(root->left, root->val) && isGreaterThan(root->right, root->val) && isValidBST(root->right) && isValidBST(root->left); } bool isLessThan(TreeNode *node, int val) { if(node == NULL) return true; return node->val<val && isLessThan(node->left, val) && isLessThan(node->right, val); } bool isGreaterThan(TreeNode *node, int val) { if(node == NULL) return true; return node->val>val && isGreaterThan(node->left, val) && isGreaterThan(node->right, val); } };
思路2:还想到一种更好的解法,BST的中序遍历是排序的,所以可以考虑到对树进行遍历,将每次遍历到的节点依次记录在一个容器中,遍历完判断是否有序即可,这种做法虽然时间优化到了o(n),但是同时也消耗了o(n)的空间。我们稍作优化,其实我们不必记录所有的节点,只需记录我们上一次遍历到的节点,然后判断当前节点是否比上次一个节点的值小即可。
以下是AC代码:
/** * Definition for binary tree * 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 *prev=NULL; return isValid(root, prev); } bool isValid(TreeNode *node, TreeNode *&prev) { if(node == NULL) return true; if(!isValid(node->left, prev)) { return false; } if(prev!=NULL && node->val<=prev->val) { return false; } prev=node; return isValid(node->right, prev); } };
本博客内容与代码均为作者Jarvis原创,如若转载请注明。