LeetCode 776スプリットBSTは、BSTでノードを削除します。

ここでのオリジナルタイトルリンク: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

注意:

  1. BSTのサイズが超えることはありません  50
  2. 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              リターン 新しいツリーノード[] { NULLNULL }。
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 }

类似Delete Node in a BST.

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/11145009.html