二叉搜尋樹中第K小的元素
題目描述:給定一個二叉搜尋樹的根節點
root
,和一個整數k
,請你設計一個演算法查詢其中第k
個最小元素(從 1 開始計數)。示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:二叉樹的中序遍歷
二叉搜尋樹的特性即中序遍歷結果就是節點的順序排列,所以通過中序遍歷的方式來查詢第k個最小元素,處理過程如下:
- 首先判斷特殊情況,如果二叉樹為空,說明沒有第K小的節點,直接返回空;
- 中序遍歷得到二叉搜尋樹的所有節點,是按順序排列的;
- 判斷如果k大於二叉樹的節點數,說明不存在第K小的節點,直接返回空;
- 返回第K小的節點。
import com.kaesar.leetcode.TreeNode;
import java.util.ArrayList;
import java.util.List;
public class LeetCode_230 {
public static int kthSmallest(TreeNode root, int k) {
// 如果二叉樹為空,說明沒有第K小的節點,直接返回空
if (root == null) {
return -1;
}
List<Integer> values = new ArrayList<>();
// 中序遍歷得到二叉搜尋樹的所有節點,是按順序的
inOrder(root, values);
// 如果k大於二叉樹的節點數,說明不存在第K小的節點,直接返回空
if (k > values.size()) {
return -1;
}
// 返回第K小的節點
return values.get(k - 1);
}
/**
* 二叉樹的中序遍歷
*
* @param root
* @param values
*/
private static void inOrder(TreeNode root, List<Integer> values) {
if (root.left != null) {
inOrder(root.left, values);
}
values.add(root.val);
if (root.right != null) {
inOrder(root.right, values);
}
}
public static void main(String[] args) {
/**
* 測試用例:
* 3
* 1 4
* 2
*/
TreeNode root = new TreeNode(3);
root.left = new TreeNode(1);
root.right = new TreeNode(4);
root.left.right = new TreeNode(2);
// 期望輸出: 1
System.out.println(kthSmallest(root, 1));
}
}
【每日寄語】 我們的希望是今天比昨天好,明天對於我們來說太遙遠了,無所謂。人活著一生不能做螢火蟲,永遠要當一個鑽井工人,永遠在頭上,為了前面的光芒努力,不是看後面怎麼樣。希望我們的過去再美好也是由於我們過去的努力,今天再努力就是為了明天的輝煌。