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

雄獅虎豹發表於2022-04-22

二叉搜尋樹中第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));
    }
}
【每日寄語】 我們的希望是今天比昨天好,明天對於我們來說太遙遠了,無所謂。人活著一生不能做螢火蟲,永遠要當一個鑽井工人,永遠在頭上,為了前面的光芒努力,不是看後面怎麼樣。希望我們的過去再美好也是由於我們過去的努力,今天再努力就是為了明天的輝煌。

相關文章