LeetCode--230.二叉搜尋樹中第K小的元素(JavaScript)
阿新 • • 發佈:2018-12-06
給定一個二叉搜尋樹,編寫一個函式 kthSmallest 來查詢其中第 k 個最小的元素。
說明:
你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜尋樹元素個數。
示例 1:
輸入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
輸出: 1
示例 2:
輸入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
輸出: 3
進階:
如果二叉搜尋樹經常被修改(插入/刪除操作)並且你需要頻繁地查詢第 k 小的值,你將如何優化 kthSmallest 函式?
思路
簡單版:
使用中序遍歷,轉換為陣列,此陣列便是遞增陣列,返回第 k-1 個元素即可。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function(root, k) {
let res = []
const inorder = (root) => {
if (root) {
inorder(root.left);
res.push(root.val);
inorder(root.right);
}
}
inorder(root);
return res[k-1]
};
進階版:
採用遞迴的方法,先求出根節點左子樹的所有節點數 leftNum,
const count = (root) => {
if (!root) {
return 0;
} else {
return 1 + count(root.left) + count(root.right);
}
}
- leftNum < k - 1 , 說明第 k 個元素在根節點的右子樹中,遞迴返回
kthSmallest(root.right, k - leftNum - 1)
- leftNum = k - 1,說明第 k 個元素剛好是根節點,返回根節點的值即可
- leftNum > k - 1,說明第 k 個元素在根節點的左子樹中,遞迴返回
kthSmallest(root.left, k)
使用遞迴的好處是不用額外空間,並且當樹頻繁修改時,也可以很好的適應。
全部程式碼:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function(root, k) {
const count = (root) => {
if (!root) {
return 0;
} else {
return 1 + count(root.left) + count(root.right);
}
}
let leftNum = count(root.left);
if (leftNum === k - 1) {
return root.val;
} else if (leftNum > k - 1) {
return kthSmallest(root.left, k)
} else {
return kthSmallest(root.right, k - leftNum - 1)
}
};