思路:
1.遍历结点,利用辅助数组存储,得到指定位置处的元素。
2.为了方便多次查询,使用哈希表来存储指定节点的子树节点数目,并通过查询二叉树性质得到指定位置的元素。
原题链接:https://leetcode.cn/problems/kth-smallest-element-in-a-bst/description/?favorite=2ckc81c
1.题目如下:
给定一个二叉搜索树的根节点 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
提示:
树中的节点数为 n 。
1 <= k <= n <= 104
0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?
2.代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
unordered_map<TreeNode*,int> numMap;
public:
//思路一:使用辅助数组,来存储中序遍历的元素,然后输出。空间复杂度O(n)
//思路二:中先序遍历的过程中用栈来存储
//思路三:对于要频繁搜索第k小的值,则只需要记录每个结点的左子树的节点数,用哈希表存储
int kthSmallest(TreeNode* root, int k) {
countNum(root);
TreeNode *node = root;
while(node!=nullptr) {
//左子树的节点数
int left=numMap[node->left];
if(left<k-1) {
node=node->right;
//k-(left+1)
k-=left+1;
} else if(left==k - 1) {
break;
} else{
node=node->left;
}
}
return node==nullptr?0:node->val;
}
//用哈希表来记录存储结点及子树的节点数
int countNum(TreeNode *root){
if(root==nullptr){
return 0;
}
numMap[root]=1+countNum(root->left)+countNum(root->right);
return numMap[root];
}
};