<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [數(shù)據(jù)結(jié)構(gòu)] 二叉搜索樹基本操作

      img

      定義

      二叉搜索樹是一種特殊的二叉樹,其定義如下:

      1. 空樹是二叉搜索樹。
      2. 若二叉搜索樹的左子樹不為空,則其左子樹上所有點的附加權(quán)值均小于其根節(jié)點的值。
      3. 若二叉搜索樹的右子樹不為空,則其右子樹上所有點的附加權(quán)值均大于其根節(jié)點的值。
      4. 二叉搜索樹的左右子樹均為二叉搜索樹。

      操作

      CRUD

      二叉搜索樹的基本操作有:查詢、新增、刪除;

      這些操作的最優(yōu)時間復雜度為 \(O(\log n)\) ,最壞時間復雜度為 \(O(n)\),隨機構(gòu)建的二叉搜索樹的期望高度為 \(O(\log n)\)。

      遍歷

      根據(jù)二叉搜索樹的定義可知:二叉搜索樹的中序遍歷結(jié)果是非降序序列

      遍歷二叉搜索樹的時間復雜度是 \(O(n)\)。

      let arr = [];
      function traverse(root){
          if(root==null)return;
          traverse(root.left);
          arr.push(root.val);
          traverse(root.right);
      }
      traverse(root);
      console.log(arr);
      

      查找最值

      • 最小值為二叉搜索樹最左邊的節(jié)點;
      • 最大值為二叉搜索樹最右邊的節(jié)點。
      function findMinNode(root){
          while(root.left!==null){
              root = root.left;
          }
          return root;
      }
      
      function findMaxNode(root){
          while(root.right!==null){
              root = root.right;
          }
          return root;
      }
      

      搜索

      遞歸搜索,分類討論:

      • root為空,則已到達葉子節(jié)點,找不到指定值;
      • root的值為target,則搜索到目標值;
      • root的值大于target,則在root的左子樹中繼續(xù)搜索;
      • root的值小于target,則在root的右子樹中繼續(xù)搜索。
      function search(root, target){
          if(root==null)return null;
      	if(root.val == target){
              return root;
          }else if(target < root.val){
              return search(root.left, target);
          }else{
              return search(root.right, target);
          }
      }
      

      插入一個元素

      flowchart TD id1((30)) --> id2((15)) & id3((41)) id3((41)) --> id4((35)) & id5((48)) id4((35)) --> id6((33)) & id7((36))

      在以 root 為根節(jié)點的二叉搜索樹中插入一個值為 value 的節(jié)點。

      分類討論:

      • root為空,直接返回一個值為value的新節(jié)點;
      • 如果root的值等于value,表示元素已存在,根據(jù)應用場景做相關(guān)處理(有的設(shè)計是節(jié)點的count屬性+1,有的設(shè)計是不做處理);
      • 如果root的值大于value,則在root的左子樹中插入值為value的節(jié)點;
      • 如果root的值小于value,則在root的右子樹中插入值為value的節(jié)點。
      function insert(root, value){
          if(root==null)return new TreeNode(value);
          
          if(root.val > value){
              root.left = insert(root.left, value);
          }else if(root.val < value){
              root.right = insert(root.right, value);
          }else{
              // root.val == value
          }
          return root;
      }
      

      刪除一個元素

      flowchart TD id1((30)) --> id2((15)) & id3((41)) id3((41)) --> id4((35)) & id5((48)) id4((35)) --> id6((33)) & id7((36))

      在以 root 為根節(jié)點的二叉搜索樹中刪除一個值為 value 的節(jié)點。

      分類討論:

      • root為葉子節(jié)點,則直接刪除;
      • root只有一個子節(jié)點,則返回這個子節(jié)點;
      • root有兩個子節(jié)點,一般用右子樹的最小值代替它,然后將它刪除。(具體的操作是將右子樹的最小值賦值給它,然后去右子樹中遞歸刪除這個值,完成“代替”)
      function remove(root, value){
          if(root==null)return null;
          
          if(value < root.val){
              // 在左子樹中搜索并刪除目標節(jié)點
              root.left = remove(root.left, value);
              return root;
          }else if(value > root.val){
              // 在右子樹中搜索并刪除節(jié)點
              root.right = remove(root.right, value);
              return root;
          }else{
              // 找到節(jié)點了
              // case 1: 葉子節(jié)點
              if(root.left==null && root.right==null){
                  root = null;
                  return root;
              }
              
              // case 2: 一個子節(jié)點
              if(root.left==null){
                  return root.right;
              }else if(root.right==null){
                  return root.left;
              }
              
              // case 3: 兩個子節(jié)點
              const findMinNode = (root)=>{
                  while(root.left!==null){
                      root = root.left;
                  }
                  return root;
              }
              const rightMin = findMinNode(root.right);
              root.val = rightMin.val;
              root.right = remove(root.right, rightMin.val);
              return root;
          }
      }
      

      題外話——Mermaid

      Mermaid官方文檔:流程圖語法 | Mermaid 中文網(wǎng) (nodejs.cn)

      最近發(fā)現(xiàn)一個在Markdown里畫圖挺好用的工具,比如上面的二叉樹就是用Mermaid畫的,可以用指令實現(xiàn)一些簡單的圖表繪制。

      比如下面這段指令:

      flowchart TD
      	id1((30)) --> id2((15)) & id3((41))
      	id3((41)) --> id4((35)) & id5((48))
      	id4((35)) --> id6((33)) & id7((36))
      
      • flowchart:流程圖;
      • TD:從上到下的繪制方向;
      • id*:標識符,和變量名一個道理;
      • ((val))val是節(jié)點中的值,(())表示圓形,[]表示矩形;
      • -->:箭頭,==>更粗的箭頭;
      • &:表示語句的組合,如果沒有這個&,則需要編寫兩行指令分別表示左右子節(jié)點的配置。

      效果圖

      flowchart TD id1((30)) --> id2((15)) & id3((41)) id3((41)) --> id4((35)) & id5((48)) id4((35)) --> id6((33)) & id7((36))

      參考文章

      [1] 二叉搜索樹 & 平衡樹 - OI Wiki

      [2] 二叉搜索樹_百度百科 (baidu.com)

      [3] 數(shù)據(jù)結(jié)構(gòu)——二叉搜索樹詳解-CSDN博客

      [4] 流程圖語法 | Mermaid 中文網(wǎng) (nodejs.cn)

      posted @ 2024-07-10 02:13  feixianxing  閱讀(85)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品小视频一区二页| 性欧美老妇另类xxxx| 18禁亚洲一区二区三区| 免费观看全黄做爰大片| 少妇人妻真实偷人精品| 精品人妻午夜一区二区三区四区| 国产美女69视频免费观看| 亚洲成av人最新无码不卡短片| 日韩剧情片电影网站| 亚洲 欧美 影音先锋| 亚洲欧洲久久激情久av| 亚洲av永久无码精品漫画| a片在线免费观看| 妓女妓女一区二区三区在线观看| 国产偷自一区二区三区在线| 日韩精品一区二区三区视频| 偷拍专区一区二区三区| 天干天干夜啦天干天干国产| 亚洲成av人片乱码色午夜| 深夜在线观看免费av| 日韩无专区精品中文字幕| 开心一区二区三区激情| 亚洲最大中文字幕无码网站| 国产精品综合av一区二区| 精选国产av精选一区二区三区| 国产97人人超碰caoprom| 国产精品嫩草99av在线| 日本一区二区三区黄色网| 国产综合视频一区二区三区| 亚洲最大福利视频网| 一区二区三区久久精品国产| 人妻偷拍一区二区三区| 色伦专区97中文字幕| 中文字日产幕码三区国产| 精品国产一区二区三区国产馆| 国产乱码1卡二卡3卡四卡5| 亚洲乱妇老熟女爽到高潮的片| 亚洲高清无在码在线无弹窗| 国产办公室秘书无码精品99| 亚洲av无码牛牛影视在线二区 | 午夜不卡久久精品无码免费|