[AcWing]70. 二叉搜索树的第k个结点

给定一棵二叉搜索树,请找出其中的第 k 小的结点。

你可以假设树和 k 都存在,并且 1≤k≤ 树的总结点数。

数据范围

树中节点数量 [1,500]

样例

1
2
3
4
5
6
7
输入:root = [2, 1, 3, null, null, null, null] ,k = 3

2
/ \
1 3

输出:3

算法思想

中序遍历二叉搜索树,找到第k个节点。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 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:

TreeNode * res;

// 注意这里的k是加了引用的
void dfs(TreeNode * root, int & k){
// 中序遍历
if(!root) return;

dfs(root -> left, k);

k--;
if(!k) res = root;
// 剪枝(找到了答案,右子树显然不需要遍历了,否则它会执着地找到空结点才停止递归)
if(k > 0) dfs(root -> right, k);
}

TreeNode* kthNode(TreeNode* root, int k) {
// 中序遍历,找到第k个节点
dfs(root, k);
return res;
}
};

时间复杂度

每个节点最多被遍历一次,因此时间复杂度是O(n)