题目描述:
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
思路:
二叉搜索树的中序遍历是有序的,所以返回中序遍历的第k个节点即可。
代码:
递归版:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
// 递归版
class Solution {
int cnt = 0;
public:
TreeNode* KthNode(TreeNode* pRoot, int k){
if (pRoot != NULL) {
TreeNode* node = KthNode(pRoot->left, k);
if (node != NULL) return node;
cnt++;
if (cnt == k) return pRoot;
node = KthNode(pRoot->right, k);
if (node != NULL) return node;
}
return NULL;
}
};
非递归版:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
// 非递归版
class Solution {
int cnt = 0;
public:
TreeNode* KthNode(TreeNode* pRoot, int k){
if (pRoot == NULL || k == 0) return NULL;
stack<TreeNode*> st;
while(pRoot != NULL || !st.empty()) {
while(pRoot != NULL) {
st.push(pRoot);
pRoot = pRoot->left;
}
TreeNode* node = st.top();
st.pop();
cnt++;
if (cnt == k) return node;
pRoot = pRoot->right;
}
return NULL;
}
};