LeetCode 0230 -- 二叉搜索樹中第k小的元素

二叉搜索樹中第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(lognlogn)O(logn * logn),找到指定的元素最壞情況下需要O(logn),獲得指定元素左子樹的size最壞情況下需要O(logn);

空間複雜度: O(logn)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);
    }
}

時間複雜度: O(k)O(k)

空間複雜度: O(logn)O(logn),給定二叉樹的深度。

發佈了128 篇原創文章 · 獲贊 0 · 訪問量 953
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章