赞
踩
目录
定义:BST是一棵空树,或者具有以下性质的二叉树:
性质:
备注:BST中序遍历是升序序列
根据以上性质,下面介绍相关BST题型
题目:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
分析:
示例代码:
- int nRet = 0;
- int nIndex = 0;
- void help(TreeNode* root,int k)
- {
- if (root == nullptr)
- {
- return ;
- }
-
- if (root->left != nullptr)
- {
- help(root->left,k);
- }
- nIndex++;
- if (k == nIndex)
- {
- nRet = root->val;
- return ;
- }
- // vecNum.push_back(root->val);
- if (root->right != nullptr)
- {
- help(root->right,k);
- }
- }
- int kthSmallest(TreeNode* root, int k) {
- help(root,k);
- return nRet;
- }
题目:给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
示例 1:
输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
示例 2:输入:root = [0,null,1]
输出:[1,null,1]
示例 3:输入:root = [1,0,2]
输出:[3,3,2]
示例 4:输入:root = [3,2,4,1]
输出:[7,9,4,10]
分析:
示例代码:
- TreeNode* convertBST(TreeNode* root) {
- help(root);
- return root;
- }
- int nSum = 0;
- void help(TreeNode* root)
- {
- if (root == nullptr)
- {
- return;
- }
- help(root->right);
- nSum += root->val;
- root->val = nSum;
- help(root->left);
- }
题目:实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4
分析:
boolean isValidBST(TreeNode root) {
if (root == null) return true;
if (root.left != null && root.val <= root.left.val)
return false;
if (root.right != null && root.val >= root.right.val)
return false;
return isValidBST(root.left)
&& isValidBST(root.right);
}但是看如图:
符合上面的代码,缺不是一棵二叉搜索树 ,因为我们只检查了该节点的左右子节点,但是BST性质是左右子树。
示例代码:
- bool isValidBST(TreeNode* root) {
- return help(root,nullptr,nullptr);
- }
- bool help(TreeNode* root,TreeNode* max,TreeNode* min)
- {
- if (root == nullptr)
- {
- return true;
- }
- if (max != nullptr && root->val >= max->val)
- {
- return false;
- }
- if (min != nullptr && root->val <= min->val)
- {
- return false;
- }
- return help(root->right,max,root) && help(root->left,root,min);
- }
题目:给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
给定二叉搜索树:
4
/ \
2 7
/ \
1 3和值: 2
你应该返回如下子树:2
/ \
1 3
分析:
示例代码:
- TreeNode* searchBST(TreeNode* root, int val) {
- return help(root,val);
- }
- TreeNode * help(TreeNode* root, int val)
- {
- if (root == nullptr)
- {
- return nullptr;
- }
- if (root->val == val)
- {
- return root;
- }
- else if (root->val > val)
- {
- return help(root->left,val);
- }
- else if (root->val < val)
- {
- return help(root->right,val);
- }
- return nullptr;
- }
题目:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
示例 1:
输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:示例 2:
输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]
示例 3:输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]
分析:
示例代码:
- TreeNode* insertIntoBST(TreeNode* root, int val) {
- return help(root,val);
- }
- TreeNode * help(TreeNode* root, int val)
- {
- if (root == nullptr)
- {
- root = new TreeNode(val);
- }
- if (root->val > val)
- {
- root->left = help(root->left,val);
- }
- else if(root->val < val)
- {
- root->right = help(root->right,val);
- }
- return root;
- }
题目:给定一个BST和一个目标数,将该节点删除。
例如:
分析:
if (root.left != null && root.right != null) {//以找右子树最小值为例
// 找到右子树的最小节点
TreeNode minNode = getMin(root.right);
// 把 root 改成 minNode
root.val = minNode.val;
// 转而去删除 minNode
root.right = deleteNode(root.right, minNode.val);
}
示例代码:
- TreeNode* deleteNode(TreeNode *root, int key) {
- if (root == nullptr)
- {
- return nullptr;
- }
- if (root->val == key) {
- // 这两个 if 把情况 1 和 2 都正确处理了
- if (root->left == nullptr)
- {
- return root->right;
- }
- if (root->right == nullptr)
- {
- return root->left;
- }
- // 处理情况 3
- TreeNode* minNode = getMin(root->right);
- root->val = minNode->val;
- root->right = deleteNode(root->right, minNode->val);
- }
- else if (root->val > key)
- {
- root->left = deleteNode(root->left, key);
- }
- else if (root->val < key)
- {
- root->right = deleteNode(root->right, key);
- }
- return root;
- }
-
- TreeNode* getMin(TreeNode* node) {
- // BST 最左边的就是最小的
- while (node->left != nullptr)
- {
- node = node->left;
- }
- return node;
- }
题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3
输出:5
示例 2:输入:n = 1
输出:1
分析:
示例代码:
- //备忘录消除一下重复子项
- int numTrees(int n) {
- vector<vector<int>> memo(n + 1, vector<int>(n + 1,0));
- return help(1,n,memo);
- }
- int help(int nLow, int nHeight,vector<vector<int>> &memo)
- {
- if (nLow > nHeight)
- {
- return 1;
- }
- if (memo[nLow][nHeight] != 0)
- {
- return memo[nLow][nHeight];
- }
- int ret = 0;
- for (int i = nLow; i <= nHeight; i++)
- {
- //以i为根节点
- int nLeft = help(nLow, i - 1,memo);
- int nRight = help(i + 1, nHeight,memo);
- ret += nLeft * nRight;
- }
- memo[nLow][nHeight] = ret;
- return ret;
- }
题目:给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:输入:n = 1
输出:[[1]]
分析:
示例代码:
- vector<TreeNode*> generateTrees(int n) {
- return help(1,n);
- }
- vector<TreeNode *> help(int nLow, int nHeight)
- {
- vector<TreeNode *> ret;
- if (nLow > nHeight)
- {
- ret.push_back(nullptr);
- return ret;
- }
- for (int i = nLow; i <= nHeight; i++)
- {
- vector<TreeNode *> left = help(nLow, i - 1);
- vector<TreeNode *> right = help(i + 1, nHeight);
-
- for (auto & leftNode : left)
- {
- for (auto &rightNode : right)
- {
- TreeNode *root = new TreeNode(i);
- root->left = leftNode;
- root->right = rightNode;
- ret.push_back(root);
- }
- }
- }
- return ret;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。