题意:
给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。
二叉搜索树满足每个节点的左子节点小于当前节点且右子节点大于当前节点。
方法一:
递归
思路:每个节点的值都满足一个区间范围。
初始化,根节点的范围 int 的范围。
如果当前节点的值小于左区间或者大于右区间,则返回 false。否则,继续分别递归左右儿子节点:递归左儿子,并将左儿子的右区间修改为父节点的值;递归右儿子,并将右儿子的左区间修改为父节点的值。
最后,如果没有返回false,说明满足二叉搜索树,返回true。
class Solution { public: bool isValidBST(TreeNode* root) { return dfs(root,INT_MIN,INT_MAX);//根节点的区间范围为int的范围 } bool dfs(TreeNode* root,int l,int r){ if(root==nullptr){ return true; } // 如果当前节点的值小于左区间或者大于右区间,则返回false if(root->val<l||root->val>r){ return false; } //递归左儿子,并将左儿子的右区间修改为父节点的值 //递归右儿子,并将右儿子的左区间修改为父节点的值 return dfs(root->left,l,root->val)&&dfs(root->right,root->val,r); } };
时间复杂度:空间复杂度:
方法二:
中序遍历
思路:栈实现中序遍历。二叉搜索树的中序遍历序列一定是从小到大的。因此,中序遍历的过程中,如果出现前一个值大于后一个的情况,则说明不满足二叉搜索树,return fasle。
class Solution { public: bool isValidBST(TreeNode* root) { stack<TreeNode*> st;//初始化 TreeNode* p=root; int pre=INT_MIN; while(!st.empty()||p!=nullptr){//栈实现中序遍历 while(p){ st.push(p);//入栈 p=p->left;//遍历左儿子 } p=st.top(); st.pop();//弹栈 if(pre>p->val)//中序序列中前一个值大于后一个值,则返回false return false; pre=p->val; p=p->right;//遍历右儿子 } return true; } };
时间复杂度:空间复杂度: