题目
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/
1 4
2
输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/
3 6
/
2 4
/
1
输出: 3
分析
利用二叉搜索树的性质,在中序遍历的过程中,如果刚好遍历到第K大个节点时,则返回此节点;如果没到第K大个节点,则返回NULL,让其回去上一层。
代码(含详细的注释)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
int *m;
m = &k;
return middleGet(root,m)->val;
}
/**
* 中序遍历获取第k节点
**/
TreeNode* middleGet(TreeNode* root,int *m){
//先变量左节点
if(root->left){
TreeNode* p = middleGet(root->left,m);
//如果返回第k个节点,就返回
if(p){
return p;
}
}
//遍历中间节点
--*m;
//如果是中间节点为第k个节点,就返回
if(!*m){
return root;
}
//后续遍历右节点
if(root->right){
TreeNode* p = middleGet(root->right,m);
//如果返回第k个节点,就返回
if(p){
return p;
}
}
//否则返回空节点,证明在此分支没找到
return NULL;
}
};
网友评论