Leetcode 第230題:Kth Smallest Element in a BST--二叉搜索樹中第K小的元素(C++、Python)

題目地址:Kth Smallest Element in a BST


題目簡介:

給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。

說明:你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。

示例 1:         

 

Input: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
Output: 1

示例 2:       

 

Input: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
Output: 3

進階:如果二叉搜索樹經常被修改(插入/刪除操作)並且你需要頻繁地查找第 k 小的值,你將如何優化 kthSmallest 函數?


題目解析:

1、簡單法:BFS先將所有的元素拿出來,然後進行排序,時間效率和空間複雜度不是最優。

C++版:

class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
        vector <TreeNode*> nodes;
        vector<int> values;
        nodes.push_back(root);
        values.push_back(root -> val);
        while(!nodes.empty())
        {
            int len = nodes.size();
            for (int i = 0; i < len; i++)
            {
                TreeNode* temp = nodes.front();
                nodes.erase(nodes.begin());
                if (temp -> left != NULL)
                {
                    nodes.push_back(temp -> left);
                    values.push_back(temp -> left -> val);
                }
                if (temp -> right != NULL)
                {
                    nodes.push_back(temp -> right);
                    values.push_back(temp -> right -> val);
                }
            }
        }
        sort(values.begin(), values.end());
        return values[k - 1];
    }
    
};

Python版:

class Solution:
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        nodes, values = [], []
        nodes.append(root)
        while len(nodes):
            _size = len(nodes)
            for i in range(_size):
                temp = nodes.pop(0)
                values.append(temp.val)
                if temp.left != None:
                    nodes.append(temp.left)
                if temp.right != None:
                    nodes.append(temp.right)
        
        values.sort()
        print(values)
        return values[k - 1]

2、搜索二叉樹的性質

因爲搜索二叉樹的順序已經排好,所以只要按照順序進行左序遍歷,返回結果即可。

Python:

class Solution:
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        values = []
        def dfs(root):
            if (len(values) >= k):
                return
            if(root.left == None and root.right == None):
                values.append(root.val)
                return
            if (root.left != None):
                dfs(root.left)
            values.append(root.val)
            if (root.right != None):
                dfs(root.right)
        dfs(root)
        print(values)
        return values[k - 1]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章