230. 二叉搜尋樹中第K小的元素
阿新 • • 發佈:2020-07-15
給定一個二叉搜尋樹,編寫一個函式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; };