日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

平衡二叉树(AVL)实现(3)-删除

發布時間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 平衡二叉树(AVL)实现(3)-删除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AVL樹節點的刪除規則

三種現象

現象1

注意:q是30,而不是20,因為刪除了25,節點會移動,以下現象均遵循此規律

現象2

現象3

現象1和現象2比較簡單,不需要平衡化處理,現象3則比較復雜.先討論現象1和2

現象1刪除步驟

先找到節點,然后刪除節點

private Node FindNode(int value){currentIndex = -1;Node node = _head;while (node != null){path[++currentIndex] = node;if (value == node.Data){return node;}if (value < node.Data){ node = node.Left;}else{ node = node.Right;}}return null;}public bool Remove(int value){var node = FindNode(value);if (node != null){RemoveNode(node);return true;}return false;}

其刪除節點的子節點<2個,即只有左節點或者右節點或者沒節點三種可能

  • 如果刪除的是右節點,那么該刪除節點的子節點(如果有的話)將會代替該節點,反之也則替換左節點
  • 代替的節點不是左節點就是右節點(只會是其中一個,若是兩個子節點的情況則另外考慮)
  • var tmp = node.Left; if (tmp == null) {tmp = node.Right; } if (currentIndex > 0) {if (path[currentIndex - 1].Left == node){ path[currentIndex - 1].Left = tmp;}else{ path[currentIndex - 1].Right = tmp;} } else {_head = tmp; }

    現象2刪除步驟

    即該節點的平衡因子為0,說明其左子樹和右子樹的高度是相同的

    刪除該節點后,其左節點代替父節點

    但程序的做法沒有我們看到這么簡單

    將左節點的值賦給父節點,然后將父節點的左節點以其原有左節點的左節點進行替換(即將15的值換成12,將15的左子節點換成12的左子節點,由于12沒有左子節點,所以12的左子節點為空),程序如下

    private void RemoveNode(Node node) {Node tmp = null;if (node.Left != null && node.Right != null){tmp = node.Left;
    node.Data = tmp.Data;node.Left = tmp.Left;} }

    現象3刪除步驟


    現象3和現象2方式前期處理方式相同,但是由于其左子樹和右子樹的高度不同導致了平衡因子出現2或-2的情況,后期還要進行處理,即是對于平衡因子的處理

    平衡因子的處理

    還是一樣,當刪除左節點時(父節點和某些祖父節點的)平衡因子-1,反之則+1

  • 現象1則+1
  • 現象2則-1
  • 現象3則是父和祖父均-1
  • 當平衡因子絕對值變成2了,則進行旋轉

    轉載于:https://www.cnblogs.com/Clingingboy/archive/2010/10/09/1846865.html

    總結

    以上是生活随笔為你收集整理的平衡二叉树(AVL)实现(3)-删除的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。