题目:
给定一棵二叉搜索树,请找出其中的第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<>(); }