二叉搜索樹中第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
解題思路
個人AC
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int kthSmallest(TreeNode root, int k) {
int leftSize = size(root.left);
if (leftSize + 1 == k) {
return root.val;
} else if (leftSize + 1 > k) {
return kthSmallest(root.left, k);
} else if (leftSize + 1 < k) {
return kthSmallest(root.right, k - leftSize - 1);
}
return -1; // forever impossibly arrive here
}
private int size(TreeNode root) {
if (root == null) return 0;
int leftSize = size(root.left);
int rightSize = size(root.right);
return leftSize + rightSize + 1;
}
}
時間複雜度: ,找到指定的元素最壞情況下需要O(logn),獲得指定元素左子樹的size最壞情況下需要O(logn);
空間複雜度: ,給定二叉樹的深度。
最優解
因爲給定的是二叉搜索樹,而BST的中序遍歷結果是一個遞增序列,因此可以在中序遍歷過程中找到第k小的元素。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int cnt = 0;
int val = 0;
public int kthSmallest(TreeNode root, int k) {
inOrder(root, k);
return val;
}
private void inOrder(TreeNode root, int k) {
if (root == null) return;
inOrder(root.left, k);
if (++cnt == k) {
val = root.val;
return;
}
inOrder(root.right, k);
}
}
時間複雜度: ;
空間複雜度: ,給定二叉樹的深度。