<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)230:二叉搜索樹(shù)中第K小的元素

          共 3281字,需瀏覽 7分鐘

           ·

          2021-04-06 11:32

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做 二叉搜索樹(shù)中第K小的元素,我們先來(lái)看題面:
          https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/

          Given the root of a binary search tree, and an integer k, return the kth (1-indexed) smallest element in the tree.

          給定一個(gè)二叉搜索樹(shù)的根節(jié)點(diǎn) root ,和一個(gè)整數(shù) k ,請(qǐng)你設(shè)計(jì)一個(gè)算法查找其中第 k 個(gè)最小元素(從 1 開(kāi)始計(jì)數(shù))。

          示例

          解題


          一看到求第K小的問(wèn)題,應(yīng)該會(huì)容易想到建立大頂堆來(lái)做,但是如果這道題采用大頂堆的方式來(lái)做的話,是比較麻煩的,還得轉(zhuǎn)換為數(shù)組,這樣的話就完全忽視了二叉搜索樹(shù)本身的特點(diǎn)。

          為了利用二叉搜索樹(shù)的特點(diǎn),一種可以采取的方法就是對(duì)二叉搜索樹(shù)進(jìn)行中序遍歷,遍歷結(jié)果必定是個(gè)升序數(shù)組,當(dāng)數(shù)組長(zhǎng)度達(dá)到k時(shí),那么數(shù)組末尾的元素就是二叉搜索樹(shù)的第K小元素了。不過(guò)這樣的話就需要一個(gè)大小為O(K)的開(kāi)辟輔助空間。

          為了既利用二叉搜索樹(shù)的特點(diǎn),又能減少輔助空間的開(kāi)銷,可以直接對(duì)左子樹(shù)結(jié)點(diǎn)進(jìn)行計(jì)數(shù),如果左子樹(shù)的結(jié)點(diǎn)數(shù)等于k-1的話,說(shuō)明當(dāng)前結(jié)點(diǎn)就是第k小的結(jié)點(diǎn)了;如果左子樹(shù)結(jié)點(diǎn)數(shù)小于k-1的話,說(shuō)明第k小的結(jié)點(diǎn)在當(dāng)前結(jié)點(diǎn)的右邊,假設(shè)左子樹(shù)上的結(jié)點(diǎn)有num個(gè),那么此時(shí)就遞歸查找右子樹(shù)上第k-1-num小的元素;如果左子樹(shù)結(jié)點(diǎn)大于k-1的話,說(shuō)明第k小的結(jié)點(diǎn)就在左子樹(shù)上,那么就遞歸查找左子樹(shù)上第k小的元素。

          中序遍歷方法

          class Solution {
              List<Integer> list = new ArrayList();
              public void dfs(TreeNode root){
                  if(root == null)
                      return ;
                  dfs(root.left);
                  list.add(root.val);
                  dfs(root.right);
              }
              public int kthSmallest(TreeNode root, int k) {
                  dfs(root);
                  for(int i=0;i<list.size();i++){
                      if(i == k-1)
                          return list.get(i);
                  }
                  return -1;
              }
          }


          使用遞歸(計(jì)算節(jié)點(diǎn)數(shù)量):

          class Solution {
              public int count(TreeNode root){
                  if(root == null)
                      return 0;
                  return 1 + count(root.left) + count(root.right);
              }
              public int kthSmallest(TreeNode root, int k) {
                  int num = count(root.left);
                  if(num == k-1)
                      return root.val;
                  if(num > k-1)
                      return kthSmallest(root.left,k);
                  return kthSmallest(root.right,k - num-1);
              }
          }

          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-220題匯總,希望對(duì)你有點(diǎn)幫助!

          LeetCode刷題實(shí)戰(zhàn)221:最大正方形

          LeetCode刷題實(shí)戰(zhàn)222:完全二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù)

          LeetCode刷題實(shí)戰(zhàn)223:矩形面積

          LeetCode刷題實(shí)戰(zhàn)224:基本計(jì)算器

          LeetCode刷題實(shí)戰(zhàn)225:用隊(duì)列實(shí)現(xiàn)棧

          LeetCode刷題實(shí)戰(zhàn)226:翻轉(zhuǎn)二叉樹(shù)

          LeetCode刷題實(shí)戰(zhàn)227:基本計(jì)算器 II

          LeetCode刷題實(shí)戰(zhàn)228:匯總區(qū)間

          LeetCode刷題實(shí)戰(zhàn)229:求眾數(shù) II



          瀏覽 56
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲日本无 | 情趣在线视频 | 嫩逼成人 | 天天综合视频老女人 | 草在线视频|