説明
要素は、よくバランスのバイナリ検索ツリーに変換するために、昇順にソートされ、重リンクリストが与えられました。
この問題では、高度にバランスバイナリツリーは二分木は、各ノードの左及び右サブツリーを指すことは、多くて1以上の絶対値の高さの差です。
例:
所与の順序付きリスト:[-10、-3、0、5、9]、
一つの可能な答えは:[0、-3、9、-10、ヌル、5]は、この高さ平衡二分探索木の下に表すことができます。
0
/ \
-3 9
/ /
-10 5
解決
順序付きリスト、バランスの取れたバイナリツリーは、中間ノードのノードの2つの部分についてです2、にリストを考えるのが自然です。およそ2部に再帰的ノード。
コード
再帰
/ ** *単一リンクリストのための定義。 *パブリッククラスListNode { * int型のval; * ListNode次。 * ListNode(INT X){ヴァル= X。} *} * / / ** バイナリツリーノードのための*の定義。 *公共のクラスのTreeNode { * int型のval; *のTreeNodeは左。 *ツリーノードを右。 *ツリーノード(INT X){ヴァル= X。} *} * / クラスソリューション{ // 私 公共のTreeNode sortedListToBST(ListNodeヘッド){ 場合(ヌル == ヘッド){ リターン ヌル。 } そう であれば(ヌル == head.next){ リターン 新しいツリーノード(head.val)。 } ListNode遅い = ヘッド。 速いListNode = ヘッド。 ListNode前 = ヘッド。 一方、(!速い= ヌル!&& fast.next = NULL ){ プリ = 遅いです。 遅い =はslow.next。 速い = fast.next.next。 } pre.next = NULL ; のTreeNodeルート = 新しいツリーノード(slow.val)。 root.left = sortedListToBST(ヘッド) root.right = sortedListToBST(slow.next)。 リターンルート。 } }
最適化のポイント
番号付きリストは、クエリの複雑さを軽減、注文した配列に変換することができます。時間・ソリューションのためのスペース。