剑指Offer-62.二叉搜索树的第k个结点(C++/Java)

题目:

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

分析:

二叉搜索树的中序遍历结果正好是按数值升序排列的结果,我们可以利用前序遍历将结点按val值的顺序存储到数组中,然后直接按索引返回即可。

程序:

C++

class Solution {
public:
    TreeNode* KthNode(TreeNode* pRoot, int k)
    {
        if(pRoot == nullptr)
            return pRoot;
        helper(pRoot);
        if(k > res.size() || k < 1)
            return nullptr;
        return res[k-1];
    }
    void helper(TreeNode* pRoot){
        if(pRoot == nullptr)
            return;
        helper(pRoot->left);
        res.push_back(pRoot);
        helper(pRoot->right);
    }
private:
    vector<TreeNode*> res;
};

Java

import java.util.*;
public class Solution {
    TreeNode KthNode(TreeNode pRoot, int k)
    {
        if(pRoot == null)
            return pRoot;
        helper(pRoot);
        if(k < 1 || k > list.size())
            return null;
        return list.get(k-1);
    }
    void helper(TreeNode pRoot){
        if(pRoot == null)
            return;
        helper(pRoot.left);
        list.add(pRoot);
        helper(pRoot.right);
    }
private ArrayList<TreeNode> list = new ArrayList<>();
}
原文地址:https://www.cnblogs.com/silentteller/p/12118658.html