二叉树刷题篇(10) 二叉搜索树

Posted 归宅观察部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树刷题篇(10) 二叉搜索树相关的知识,希望对你有一定的参考价值。


700. 二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

https://leetcode-cn.com/problems/search-in-a-binary-search-tree/


……这题看来是来拜年的,直接放代码。
class Solution {public: TreeNode* searchBST(TreeNode* root, int val) { if(root==NULL) return NULL; if(root->val==val) return root; if(root->val<val){ return searchBST(root->right,val); } if(root->val>val){ return searchBST(root->left,val); } return NULL;
}};

98.验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。

https://leetcode-cn.com/problems/validate-binary-search-tree


不得不说这题一眼看上去太适合递归了……先试一试吧。

试了一下果然不对!这道题有一个陷阱,直接上图吧。
这种情况应该返回false,如果在递归逻辑中只判断左右节点,就会错判这种情况。

方法首先是将二叉树进行中序遍历存到数组中,判断数组是否递增。

今天有点累就不自己写代码了,直接上参考答案,代码如下:
class Solution {private: vector<int> vec; void traversal(TreeNode* root) { if (root == NULL) return; traversal(root->left); vec.push_back(root->val); // 将二叉搜索树转换为有序数组 traversal(root->right); }public: bool isValidBST(TreeNode* root) { vec.clear(); // 不加这句在leetcode上也可以过,但最好加上 traversal(root); for (int i = 1; i < vec.size(); i++) { // 注意要小于等于,搜索树里不能有相同元素 if (vec[i] <= vec[i - 1]) return false; } return true; }};//代码来自公众号代码随想录 作者为Carl
迭代法一样,也是将二叉搜索树转换为有序数组并判断。
class Solution {public: TreeNode* pre = NULL; // 用来记录前一个节点  bool isValidBST(TreeNode* root) { if (root == NULL) return true; bool left = isValidBST(root->left);
if (pre != NULL && pre->val >= root->val) return false; pre = root; // 记录前一个节点
bool right = isValidBST(root->right); return left && right; }};

以上是关于二叉树刷题篇(10) 二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数

二叉树刷题篇镜像二叉树与二叉树深度

二叉树刷题篇(咕)

二叉树刷题篇平衡二叉树与二叉树的所有路径

二叉树刷题篇 最大二叉树 and 合并二叉树

二叉树刷题篇