(C++)剑指offer-62:二叉搜索树的第k个结点
二叉搜索树按照中序遍历的顺序打印出来即是从小到大排序的顺序,因此第k个结点即为结果。先找根节点对应的左子树,再找根节点,每找一个结点k–,如果k等于0,此时对应的结点即为所求,否则继续找根节点的右子树,依次遍历。时间复杂度为O(n),1<=k<=TreeNodeNum,具体代码如下:
class Solution {
public:
TreeNode* ans;
TreeNode* kthNode(TreeNode* root, int k) {
dfs(root, k);
return ans;
}
void dfs(TreeNode* root, int &k){
if(!root) return; //opps
dfs(root->left, k);
k--;
if(!k) ans = root;
if(k > 0) dfs(root->right, k);
}
};
如果测试样例中没有设置k<=二叉树的结点个数,如牛客网对应代码如下:
class Solution {
public:
int count = 0;
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot != NULL){
auto ans = KthNode(pRoot->left, k);
if(ans != NULL)
return ans;
if(++count == k)
return pRoot;
ans = KthNode(pRoot->right, k);
if(ans != NULL)
return ans;
}
return NULL;
}
};