二つのバイナリ検索ツリーにleetcode 1305のすべての要素

2二分探索木を考える  root1 と  root2

入ったリストを返します  すべての整数  から  両方のツリーが  昇順にソートします。

 

例1:

入力:ROOT1 = [2,1,4]、root2 = [1,0,3] 
出力:[0,1,1,2,3,4]

例2:

入力:ROOT1 = [0、-10,10]、root2 = [5,1,7,0,2] 
出力:[-10,0,0,1,2,5,7,10]

例3:

入力:ROOT1 = []、root2 = [5,1,7,0,2] 
出力:[0,1,2,5,7]

例4:

入力:ROOT1 = [0、-10,10]、root2 = [] 
出力:[-10,0,10]

例5:

入力:ROOT1 = [1、NULL、8]、root2 = [8,1] 
出力:[1,1,8,8]

 

制約:

  • 各ツリーは、最大であり  5000 、ノード。
  • 各ノードの値が間にあります  [-10^5, 10^5]

 

タイトル効果:2つのバイナリ検索ツリーを考えるには、リストの要素の順序を昇順でリストが2つのツリーのノード値で返します。

思考:シーケンスの先行順バイナリ検索ツリーを非減少、我々は最初の2つのバイナリ検索ツリートラバーサルシーケンスの二つの配列を非減少入手することができ、2つの配列が再結合されます。

1  クラスソリューション{
 2      // 先行予約して保存
3。     ボイドトラバース(ツリーノード*根、ベクトル< INT >&V){
 4。         IF(ルート== nullptr A)
 5。             復帰;
 6          トラバース(ディレクトリroot-> 左、V)。
 。7          v.push_back(ディレクトリroot-> ヴァル)
 。8          トラバース(ディレクトリroot-> 右、V);
 9      }
 10      // 2ベクトルをマージ
。11      ベクトル< INT >マージ(ベクトル< 整数 > V1、ベクトル< INT > V2) {
12          ベクター< INT > V(v1.size()+ v2.size())。
13          INTは私= 0、J = 0、インデックス= 0 14          一方(I <v1.size()|| J < v2.size()){
 15              であれば((J == v2.size())||(I <v1.size()&& V1 [i]が< = V2 [J])) 
 16                  V [インデックス++] = V1 [I ++ ]。
17              他の
18                  V [インデックス++] = V2 [J ++ ];
19          }
 20          リターンV。
21      }
 22  公共23     ベクトル< 整数 > getAllElements(TreeNodeの* ROOT1、ツリーノード* root2){
 24          // ios_base :: sync_with_stdio(偽); 
25の          IOS :: sync_with_stdio();
26          cin.tie(NULL)。
27          
28          ベクトル< int型 > V1、V2;
29          トラバース(ROOT1、V1)。
30          トラバース(root2、V2)。
31          
32          リターンマージ(V1、V2)。
33      }
 34 }。

時間の複雑さ:O(n)は、

宇宙複雑:O(n)は、

python3:

1つの #のバイナリツリーノードの定義。
2つの クラスツリーノード:
3       DEF __init __(自己、X):
4           self.val = X 
5           self.left =なし
6           self.right =なし
7  
8  クラスソリューション:
 9つの     デフDFS(自己、根、ARR ):
 10          なら ないルート:
 11              リターン 
12          self.dfs(root.left、ARR)
 13          arr.append(root.val)
 14          self.dfs(root.right、ARR)
 15              
16     DEF getAllElements(自己、ROOT1:ツリーノード、root2:ツリーノード) - > リスト[INT]:
 17の         デフDFS(ルート、ANS):
18               ルートでない場合:
19の                  リターン
20の              DFS(root.left、ANS)
21               ans.append(root.val)
22の              DFS(root.right、ANS)
23          
24          LIST1、LIST2 = []、[]
 25          self.dfs(ROOT1、LIST1)
 26          self.dfs(root2、LIST2)
 27          LIST1 .extend(LIST2)
 28          list1.sort()
 29          戻りリスト1
30          I、J = 0,0 
31          RES = [] 
32          中にI <lenの(LIST1)またはJ <LEN(LIST2):
33               IF(J> = LEN(LIST2)または(I <lenの(LIST1 )及び(LIST1 [I] <= LIST2 [J]))):
34                   res.append(LIST1 [i])と
35                   I + = 1 
36               他:
37                   res.append(LIST2 [J])
38                   jは+ = 1つの
39          #のリターンRES

 

おすすめ

転載: www.cnblogs.com/qinduanyinghua/p/12119711.html