【Leetcode 230】js 二叉搜尋樹的第k小的元素
阿新 • • 發佈:2021-02-04
技術標籤:資料結構與演算法資料結構二叉樹演算法leetcodejavascript
二叉搜尋樹的第k小的元素
題目
給定一棵二叉搜尋樹,請找出其中的第k小的結點。 例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。
示例 1:
輸入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
輸出: 1
思路
二叉搜尋樹的中序遍歷即排序後的節點,本題實際考察二叉樹的遍歷。
程式碼
遞迴實現
function KthNode(root, k) {
const arr = [];
orderTraversal (root, arr)
if (k > 0 && k <= arr.length) {
return arr[k - 1];
} else {
return null
}
}
function orderTraversal(root, arr) {
if (root) {
orderTraversal(root.left, arr);
arr.push(root);
orderTraversal(root.right, arr);
}
}
非遞迴實現
function KthNode(root, k) {
const result = [];
const stack = [];
let current = root;
while (current || stack.length > 0) {
while (current) {
stack.push(current);
current = current.left;
}
current = stack.pop();
result.push(current);
current = current.right;
}
if (k > 0 && k <= result.length) {
return result[k - 1];
} else {
return null;
}
}
其實我們不需要獲取所有的result存起來,只要獲取第k個result就好了
function kNode(node, k) {
//非遞迴.中序
const stack = [];
let current = node;
let sum = 1;
while (current || stack.length > 0) {
while (current) {
stack.push(current);
current = current.left;
}
current = stack.pop();
if (sum === k) {
return current;
} else {
sum++;
}
current = current.right;
}
}
寫法 | 優點 | 缺點 |
---|---|---|
遞迴寫法 | 簡單明瞭 | 效能太差,容易棧溢位 |
迴圈寫法 | 效能強 ,理論上不會棧溢位 | 不直觀 |
更多資料
整理不易,若對您有幫助,請給個「關注+點贊」,您的支援是我更新的動力