順序付けられたリンクリストをバイナリ検索ツリーに変換する

1.需要

  • 単一リンクリストが与えられると、その中の要素は昇順でソートされ、高度にバランスの取れた二分探索木に変換されます。

  • この質問では、高度にバランスの取れた二分木は、二分木の各ノードの左右のサブツリー間の高さの差の絶対値が1を超えないことを意味します。

第二に、スピードポインター

2.1思考分析

  1. 順序付きリンクリストの場合、中央の要素を検索する場合は、高速ポインタと低速ポインタを使用する必要があります。高速ポインタが低速ポインタよりも1スペース多く移動するたびに、高速ポインタがnullまたは次の要素を指している場合高速ポインタのがnullを指している場合、低速です。ポインタは中央の要素を指します。
  2. 手順1を除いて、基本的な考え方は「順序付けられた配列を二分探索木に変換する」と同じです。

2.2コードの実装

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null) return null;
        return helper(head, null);
    }
    //符合左闭右开
    public TreeNode helper(ListNode head, ListNode tail) {
        if(head == tail) return null;
        ListNode fast = head;
        ListNode slow = head;
        while(fast != tail && fast.next != tail) {
            fast = fast.next.next;
            slow = slow.next;
        }
        TreeNode root = new TreeNode(slow.val);
        root.left = helper(head, slow);
        root.right = helper(slow.next, tail);
        return root;
    }
}

2.3複雑さの分析

  • 時間計算量はO(N)であり、二分探索木の確立には、すべてのリンクリストノードの走査が必要です。
  • スペースの複雑さはO(log_2N);

おすすめ

転載: blog.csdn.net/Sruggle/article/details/113445427