持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
题目描述
解题思路
这个题目我们首先要知道什么是二叉搜索树,二叉搜索树的特点是一个节点的左子节点比该节点小,右子节点比该节点大。
那么二叉搜索树的中序遍历有什么特点?
二叉搜索树: [3,1,4,null,2] 中序遍历结果:[1,2,3,4] 第1大的元素是res.length - 1(k):下标为3
二叉搜索树:[5,3,6,2,4,null,null,1] 中序遍历结果:[1,2,3,4,5,6] 第3大的元素是res.length - 3(k):下标为4
从上面的例子中我们可以看出,要想求一颗二叉搜索树的第K大节点,可以对一颗二叉搜索树进行中序遍历,然后将遍历结果数组的长度减去K就是第K大节点对应的下标。
- 如果传入节点为空,则返回null。
if (!root) return null;
- 定义结果数组
const res = [];
- 进行中序遍历
const midOrder = (root) => {
if (!root) return null;
midOrder(root.left);
res.push(root.val);
midOrder(root.right);
}
midOrder(root);
- 返回二叉搜索树第K大节点对应的下标
return res[res.length - k];
AC代码
var kthLargest = function(root, k) {
if (!root) return null;
const res = [];
const midOrder = (root) => {
if (!root) return null;
midOrder(root.left);
res.push(root.val);
midOrder(root.right);
}
midOrder(root);
return res[res.length - k];
};
反思
二叉搜索树的第K大节点是一个很好的题目,我原本想的是直接对二叉搜索树进行遍历,然后进行排序,然后返回第K大的节点,但是这样做显然是没有利用二叉搜索树的特点,尤其是没有利用二叉搜索树进行中序遍历的特点,只要知道了二叉搜索树的中序遍历的特点,便可迎刃而解。