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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

將有序數組轉換為二叉搜索樹

  • 近一年都比較關注算法相關的知識,也刷了不少題,之前的文章中大多也是算法相關的文章,但是感覺每次遇到樹相關的題型都不能應對自如,因此還是有必要在相關知識上下功夫,因此有此次總結,以下是所有樹相關的文章

數據結構與算法–面試必問AVL樹原理及實現

數據結構與算法–二叉樹的深度問題

數據結構與算法–二叉堆(最大堆,最小堆)實現及原理

數據結構與算法–二叉查找樹轉順序排列雙向鏈表

數據結構與算法-- 二叉樹中和為某一值的路徑

數據結構與算法-- 二叉樹后續遍歷序列校驗

數據結構與算法-- 廣度優先打印二叉樹

數據結構與算法–解決問題的方法- 二叉樹的的鏡像

數據結構與算法–重建二叉樹

數據結構與算法–二叉查找樹實現原理

數據結構與算法–二叉樹實現原理

數據結構與算法–B樹原理及實現

數據結構與算法–數字在排序數組中出現次數

數據結構與算法–死磕二叉樹

數據結構與算法–二叉樹第k個大的節點

數據結構與算法–力扣108提將有序數組轉換為二叉搜索樹

原題

  • 給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜索樹。本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
  • 通上一篇中一樣,平衡二叉樹,高度差不超過1,其實就是AVL樹

分析

  • AVL(Adelson-Velskii 和landis)樹是帶有平衡條件的二叉查找樹,這個平衡條件必須容易實現,并且保證樹的深度必須是O(logN)。因此我們讓一棵AVL樹中每個節點的左子樹和右子樹的高度最多相差1(空樹高度定義-1)如下圖,左邊是AVL樹,右邊不是AVL樹。

  • 對AVl樹的構建實現以及原理在之前的文章 數據結構與算法–面試必問AVL樹原理及實現 有做詳細的分析
  • 算法分析:
    • 同上篇中思路,因為是順序鏈表,并且要求平衡二叉樹,那么左右節點數一樣,鏈表中間節點middle就是樹的根
    • head節點到middle是leftTree, middle節點到Tail是rightTree
    • 同樣對于左子樹,右子樹,也依據第一步驟中,取中間節點作為根,分別得出對應的樹結構
    • 如上,中間節點查找我們可以用快慢指針,fast每次2步,slow每次一步,得到的slow就是中間節點
    • 首先我們對head~ ail(此時tail可以用null代替,最后節點就是null節點),得到中間節點slow,并且構建根slowNode
    • 接著我們分別對head ~ slow ,slow.next ~ tail分別求中間節點并且構建對應的樹節點,依次遞歸每個左右子樹

算法實現

  • 實現中所有的鏈表節點ListNode, 樹節點BinaryNode的實現均出自自己的算法實現在之前的文章中有詳細的實現分析。
/*** @author liaojiamin* @Date:Created in 14:31 2022/2/22*/ public class ConverListToBinary {public static void main(String[] args) {ListNode listNode = new ListNode("i", 1);for (int i = 6; i < 26; i++) {MyLinkedList.addToTail(listNode, i + "_"+ i, i);}ListNode head = listNode;ListNode headNext = listNode.getNext();while (headNext != null){headNext.setBefore(head);head = headNext;headNext = headNext.getNext();}BinaryNode binaryNode = buildTree(listNode, null);BinarySearchTree binarySearchTree = new BinarySearchTree();binarySearchTree.printTree(binaryNode);}public static BinaryNode buildTree(ListNode listNode, ListNode tail){if(listNode == tail){return null;}ListNode slow = listNode;ListNode fast = listNode;while (fast != tail && fast.getNext() != tail){fast = fast.getNext().getNext();slow = slow.getNext();}BinaryNode binaryNode = new BinaryNode(slow.getValue(), null, null);binaryNode.setLeft(buildTree(listNode, slow));binaryNode.setRight(buildTree(slow.getNext(), tail));return binaryNode;} }

上一篇:數據結構與算法–力扣108題將有序數組轉換為二叉搜索樹

總結

以上是生活随笔為你收集整理的数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树的全部內容,希望文章能夠幫你解決所遇到的問題。

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