题目
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
树中的节点数为 n 。
1 <= k <= n <= 104
0 <= Node.val <= 104
思路
可以采用中序遍历的方式,先遍历左子节点,然后是父亲节点,最后是右子节点。
从最小的左子节点开始计数,依次遍历,当计数到k时输出即可
代码
/**
* 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 {
public:
int i=0;
int kthSmallest(TreeNode* root, int k) {
return find(root, k);
}
int find(TreeNode* root, int k){
int f=-1;
if(root->left!=NULL){
f = find(root->left, k);
if(f!=-1) return f;
}
if(root!=NULL){
i++;
if(i==k) return root->val;
}
if(root->right!=NULL){
f = find(root->right, k);
if(f!=-1) return f;
}
return f;
}
};
问题
- 遍历各点时需先判断是否为空
- root->val不需要判空,如果判空的话会过滤掉0这个数,具体原因不清楚
(更)原因找到:
C语言标准中规定NULL为0