这道题不久前在LeetCode上做过, 二叉搜索树的中序遍历序列就是单调递增的。
解法:递归的中序遍历,遍历到第k个节点结束递归返回;结果也作为参数列表的一部分:这是递归调用不知道如何返回结果时的一种变通的做法。注意 result 初始化为 nullptr,这样不足k个节点时,会返回nullptr。
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(!pRoot) return nullptr;
TreeNode* result = nullptr;
preorder(pRoot, k, result);
return result;
}
void preorder(TreeNode* pNode, int& k, TreeNode* &result) {
if(pNode == nullptr) return;
if(pNode->left && k>0) preorder(pNode->left, k, result);
k--;
if(k==0) result = pNode;
if(pNode->right && k>0) preorder(pNode->right, k, result);
}
};
将上述程序稍作改动,递归返回结果,表面逻辑上看起来没有问题,但运行就是有问题,会一直递归到指向空节点返回!原因还未知!
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(!pRoot) return nullptr;
return inorder(pRoot, k);
}
TreeNode* inorder(TreeNode* pNode, int& k) {
if(pNode == nullptr) return nullptr;
if(pNode->left && k>0) return inorder(pNode->left, k);
k--;
if(k==0) return pNode;
if(pNode->right && k>0) return inorder(pNode->right, k);
}
};
书上关于中序遍历递归到第k个返回的写法:
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(!pRoot || k<1) return nullptr;
return inorder(pRoot, k);
}
TreeNode* inorder(TreeNode* pNode, int& k) {
TreeNode* targetNode = nullptr;
if(pNode->left)
targetNode = inorder(pNode->left, k);
if(targetNode == nullptr) {
k--;
if(k == 0) {
targetNode = pNode;
}
}
if(targetNode == nullptr && pNode->right)
targetNode = inorder(pNode->right, k);
return targetNode;
}
};