在力扣解决230题二叉搜索树中第K小的元素中,无意中遇到了这样的问题,记录一下原因,
class Solution {
public:
vector<int> res;
void inorderTraversal(TreeNode* root) {
inorder(root, res);
}
void inorder(TreeNode* root, vector<int>& res) {
if (root == nullptr) return;
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right, res);
}
int kthSmallest(TreeNode* root, int k) {
inorderTraversal(root);
return res[k - 1];
}
};
大致思路是由于是二叉搜索树,所以对于任意一个结点,左子树都小于该结点值,右子树都大于该结点值,利用中序遍历的递归方法,可以获得升序排列的数组,那么返回数组下标k-1的元素就可以得到第k小的元素。
在上述代码中,如果注释掉inorderTraversal(root); 会报错:
数组越界的情况这里不存在,直接原因就是创建vector res; 后,没有进行添加元素操作就进行下标返回return res[k - 1]; vector是动态数组,编译时不分配空间不报错,但是运行时就会报错。
以前看C++Primer,对于概念只是了解或者不明白为什么这么说,通过一些实践后对于概念理解更深入了,所以代码还是要多写多思考原因,不能只停留在光看的层面,对于一些解决的问题也可以记录一下,积少成多,踏实稳进。