ルート・ノードのルート、及び目標値Vとバイナリ検索ツリー(BST)与えられた一つのサブツリーは、すべてのより小さな又は目標値に等しいノードを持つ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は常に有効であり、各ノードの値が異なっています。
再帰:
難しい部分はrecurionロジックを見つける方法であります
ましょう res[0]
、木よりも小さいかVに等しくなるよう res[1]
V.よりも大きい木も
詳細説明:まず第一に、我々は(より大きなサブツリーで以下のサブツリーのいずれかで)与えられたルートは、答えに常にあることがわかります。その後、場合 root->val > V
、サブツリー内のいくつかの部分木があるという可能性があり root->left
、そのサブツリーが接続する必要がVよりも多分大きいとは root->left
。今、私たちは「内のサブツリーsplitingのこの問題ことがわかり root->left
Vを使用したが、」分割の現在の問題と同じです root
。だから我々は左側に再帰し、必要な結果を得ることができます。です心配することの一つは、にはサブツリー何がある場合は root->left
それがVよりも大きくありませんか?この場合は、ベースケースによって自動的に処理されます。
同様の議論は、ケースにも適用されます root->val <= V
。
1 / ** 2 分木のノードのための*の定義。 3 *パブリッククラスツリーノード{ 4 * int型のval; 5 *のTreeNodeは左。 6 *のTreeNodeは正しいです。 7 *ツリーノード(INT X){ヴァル= X。} 8 *} 9 * / 10 クラスソリューション{ 11 公共のTreeNode [] splitBST(ツリーノードのルート、int型V){ 12の // RES [0] RESのツリーのルート<= V、およびその逆である[1] 13 ツリーノード[] RES = 新しいツリーノード[2 ]。 14 もし(ルート== NULL)戻りRES。 15 16 であれば(root.val> V){ 17の RES [1] = 根。 18 ツリーノード[]左側= splitBST(root.left、V)。 19 root.left =左側[1 ]。 20の RES [0] =左側[0 ]。 21 } 22 他 { // root.val <= V 23の RES [0] = 根。 24 ツリーノード[] rightSide = splitBST(root.right、V)。 25 root.right = rightSide [0 ]。 26の RES [1] = rightSide [1 ]。 27 } 28の 29 戻りRES。 30 } 31 }