LeetCode:62 二叉搜索树第K小的节点

这道题不久前在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;
    }
};
发布了97 篇原创文章 · 获赞 11 · 访问量 2463

猜你喜欢

转载自blog.csdn.net/chengda321/article/details/104262984