题目描述

LeetCode——二叉搜索树的第k大节点(借助中序遍历)_算法

解题思路

这个题目我们首先要知道什么是二叉搜索树,二叉搜索树的特点是一个节点的左子节点比该节点小,右子节点比该节点大。

那么二叉搜索树的中序遍历有什么特点?

二叉搜索树: [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大节点对应的下标。​

  1. 如果传入节点为空,则返回null。
if (!root) return null;
  1. 定义结果数组
const res = [];
  1. 进行中序遍历
const midOrder = (root) => {
if (!root) return null;
midOrder(root.left);
res.push(root.val);
midOrder(root.right);
}
midOrder(root);
  1. 返回二叉搜索树第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大的节点,但是这样做显然是没有利用二叉搜索树的特点,尤其是没有利用二叉搜索树进行中序遍历的特点,只要知道了二叉搜索树的中序遍历的特点,便可迎刃而解。