剑指OFFER-找出二叉搜索树第k小的节点

题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, 层序遍历序列(5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

此题难度不大,如果对二叉搜索树熟悉的话可以看出,如果对树进行中序遍历,则得到的序列就是从小到大排列的。

因此可以得出算法代码,此处用递归进行实现

class Solution {
public:
    TreeNode* KthNode(TreeNode* pRoot, int k)
    {
        int Num=0;
        if(pRoot==nullptr) return nullptr;
        TreeNode *Node = pRoot;
        TreeNode *Res = nullptr;
        KthNodeRecur(Node,Res,Num,k);
        return Res;
    }
    void KthNodeRecur(TreeNode *Node, TreeNode *&Res, int &Num, int k){
        if(Res) return;
        if(!Node) return;
        KthNodeRecur(Node->left,Res,Num,k);
        Num++;
        if(Num==k&&!Res) {
            Res=Node;
            return;
        }
        KthNodeRecur(Node->right,Res,Num,k);
    }

    
};

与普通的中序遍历算法相比,此处添加了一个节点Res用于输出结果。节点必须以引用传入函数,以保证在递归中可以随时修改其值并返回。另外也声明了一个用于记录已遍历节点数的变量Num,此变量也必须声明为引用以便在递归函数中修改其值。
题目来源:https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13&tqId=11215&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tPage=4

你可能感兴趣的:(数据结构)