C++ 中最近的二叉搜索树值 II
假设我们有一个二叉搜索树和一个目标值;我们必须在该 BST 中找到 k 个最接近目标的值。我们必须记住目标值是一个浮点数。我们可以假设 k 始终有效,并且 k ≤ 总节点数。
因此,如果输入类似于
target = 3.714286,并且 k = 2,则输出将为 [4,3]
要解决此问题,我们将遵循以下步骤 -
定义一个函数 pushSmaller(),它将接收节点、栈 st 和目标值,
当节点不存在时,执行 -
如果节点的值 < 目标值,则 -
将节点插入 st
节点 := 节点的右子节点
否则
节点 := 节点的左子节点
定义一个函数 pushLarger(),它将接收节点、栈 st 和目标值,
当节点为空时,执行 -
如果节点的值 >= 目标值,则 -
将节点插入 st
节点 := 节点的左子节点
否则
节点 := 节点的右子节点
从主方法执行以下操作 -
定义一个数组 ret
定义一个栈 smaller
定义一个栈 larger
pushLarger(root, larger, target)
pushSmaller(root, smaller, target)
当 k 不为零时,在每个步骤中递减 k,执行 -
如果 smaller 不为空,并且 (larger 为空或 |target - smaller 栈顶元素的值| < |target - larger 栈顶元素的值|)
curr = smaller 栈顶元素
从 smaller 中删除元素
将 curr 的值插入 ret 的末尾
pushSmaller(curr 的左子节点, smaller, target)
否则
curr = larger 栈顶元素
从 larger 中删除元素
将 curr 的值插入 ret 的末尾
pushSmaller(curr 的右子节点, larger, target)
返回 ret
示例
让我们看看以下实现以更好地理解 -
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: vector<int> closestKValues(TreeNode* root, double target, int k) { vector<int> ret; stack<TreeNode*> smaller; stack<TreeNode*> larger; pushLarger(root, larger, target); pushSmaller(root, smaller, target); while (k--) { if (!smaller.empty() && (larger.empty() || (abs(target - smaller.top()->val) < abs(target - larger.top()->val)))) { TreeNode* curr = smaller.top(); smaller.pop(); ret.push_back(curr->val); pushSmaller(curr->left, smaller, target); } else { TreeNode* curr = larger.top(); larger.pop(); ret.push_back(curr->val); pushLarger(curr->right, larger, target); } } return ret; } void pushSmaller(TreeNode* node, stack <TreeNode*>& st, double target){ while (node) { if (node->val < target) { st.push(node); node = node->right; } else { node = node->left; } } } void pushLarger(TreeNode* node, stack <TreeNode*>& st, double target){ while (node) { if (node->val >= target) { st.push(node); node = node->left; } else node = node->right; } } }; main(){ Solution ob; vector<int> v = {4,2,5,1,3}; TreeNode *root = make_tree(v); print_vector(ob.closestKValues(root, 3.7142, 2)); }
输入
{4,2,5,1,3}, 3.7142, 2
输出
[4, 3, ]