1. 程式人生 > 實用技巧 >230. 二叉搜尋樹中第K小的元素

230. 二叉搜尋樹中第K小的元素

給定一個二叉搜尋樹,編寫一個函式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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst


1)二叉搜尋樹的性質,root 大於左子樹,小於右子樹,如果左子樹的節點是 k-1,那麼 root 就是結果,否則如果左子樹節點數目小於 K-1,那麼結果就在右子樹,否則就在左子樹。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 
*/ /** * @param {TreeNode} root * @param {number} k * @return {number} */ function Count(node){ if(node===null)return 0; const l=Count(node.left); const r=Count(node.right); return l+r+1; } var kthSmallest = function(root, k) { const l=Count(root.left); if(l===k-1)return root.val;
else if(l<k-1)return kthSmallest(root.right,k-l-1); return kthSmallest(root.left,k); };

2)中序遍歷一個二叉查詢樹(BST)的結果是一個有序陣列,因此只需要在遍歷到第k個,返回當前元素即可

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthSmallest = function(root, k) {
    const stack=[root];
    let cur=root;
    let i=0;

    function insertLefts(cur){
        while(cur&&cur.left){
            const l=cur.left;
            stack.push(l);
            cur=l;
        }
    }
    insertLefts(cur);

    while(cur=stack.pop()){
        i++;
        if(i===k)return cur.val;
        const r=cur.right;
        if(r){
            stack.push(r);
            insertLefts(r);
        }
    }
    return -1;
};