ここでのオリジナルタイトルリンク:https://leetcode.com/problems/split-bst/
トピック:
ルートノードとバイナリ検索ツリー(BST)与えられ root
、目標値 V
、他のサブツリーがより大きいすべてのノードを有し、一方のサブツリーは、すべてのより小さな又は目標値に等しいノードを持つ2つのサブツリーにツリーを分割目標値。それは必ずしもツリーは値を持つノードが含まれている場合ではありません V
。
また、オリジナルの木の構造の大部分が残っているはずです。彼らは、分割後に同じサブツリーの両方にある場合は正式には、元のツリー内の親Pと任意の子Cのために、その後、ノードCは、まだ親P.を持つべきです
あなたは、任意の順序で、分割後の出力の両方のサブツリーのルートのTreeNodeをする必要があります。
例1:
入力:ルート= [4,2,6,1,3,5,7]、V = 2 出力:[2,1]、[4,3,6、NULL、NULL、5,7] 説明: TreeNodeオブジェクト、ない配列である[1]その根、出力[0]、及び出力に注意してください。 所与のツリー[4,2,6,1,3,5,7]は以下の図で表されている: 4 / \ 2 6 / \ / \ 1 3 5 7 を出力するための図である間: 4 / \ 3 6及び2 / \ / 5 7 1
注意:
- BSTのサイズが超えることはありません
50
。 - BSTは常に有効であり、各ノードの値が異なっています。
ソリューション:
現在のノードの値がVよりも大きい場合、その左部分木にDFSをperfor。
戻り値は2本の木の配列です。最初のものは第二のボルトより大きい、より小さい又はVに等しいです。
そして、現在のノードの左の子供は最初のものでなければなりません。今、その左部分木を含む現在のノードは、すべてのよりも小さいかVに等しく、アレイの新しい最初の要素として使用し、返却するための第2の要素を既存のです。
その逆。
時間計算:O(H)。
スペース:O(H)。
ACのJava:
1 / ** 2 分木のノードのための*の定義。 3 *パブリッククラスツリーノード{ 4 * int型のval; 5 *のTreeNodeは左。 6 *のTreeNodeは正しいです。 7 *ツリーノード(INT X){ヴァル= X。} 8 *} 9 * / 10 クラスソリューション{ 11 公共のTreeNode [] splitBST(ツリーノードのルート、int型V){ 12 であれば(ルート== NULL ){ 13 リターン 新しいツリーノード[] { NULL、NULL }。 14 } 15 16 であれば(root.val> V){ 17 のTreeNode []左= splitBST(root.left、V)。 18 root.left =左の[1 ]。 19 戻り 新しいツリーノード[] {左側[0 ]、ルート}。 20 } 他{ 21 のTreeNode []右= splitBST(root.right、V)。 22 root.right =右の[0 ]。 23 戻り 新しいツリーノード[] {ルート、右の[1 ]}。 24 } 25 } 26 }