中
整数を考えると nは、全ての構造的にユニークなBSTの(二分探索木)を生成するその店は1つの...値 Nを。
例:
入力:3 出力 : [ [1、NULL、3,2]、 [3,2、NULL、1]、 [3,1、NULL、NULL、2]、 [2,1,3]、 [1、NULL 、2、NULL、3] ] 説明: 上記の出力は5つのユニークなBSTに対応を以下に示すの: 1 3 3 2 1 \ / / / \ \ 3 2 1 3 2 / / \ \ 2 1 2 3
注意点
definationを木の
書式#include <iostreamの> の#include <ベクトル> std名前空間を使用しました。 #include <iostreamの> する#include <ベクトル> // segementデフォルト内存操作不当 構造体のTreeNode { int型のval; ツリーノード*左; ツリーノード*右; ツリーノード(int型X):ヴァル(x)は、左(NULL)、右(NULL){} }。 クラスソリューション { パブリック: ベクトル<ツリーノード*> generateTrees(int型N) { IF(N == 0){リターン}; CONSTオート&ANS = generateTrees(1、N) COUT << ans.size()<< ENDL。 ANSを返します。 } プライベート: ベクトル<ツリーノード*> generateTrees(int型L、int型R) IF(L> R)リターン{nullptr}。 ベクトル<TreeNodeの*> ANS; (++ iは; I <= R iは、Lが= INT)のために (左ツリーノード*:generateTrees(L、I-1))のために :(generateTrees(I + 1、R)ツリーノード*右)のために { ans.push_backを(新しいツリーノード(I)); ans.back() - >左=左。 ans.back() - >右=右。 } 戻りANS。 } }。 //クラスのソリューション{ //パブリック: //ベクトル<ツリーノード*> generateTrees(int型N){ //もし(N == 0){リターン}; // CONSTオート&ANS = generateTrees(1、N) // coutの<< ans.size()<<てendl; // ANSを返します。 //} //プライベート: //ベクトル<ツリーノード*> generateTrees(int型のL、R INT){ //場合(L> R)リターン{nullptr}。 //ベクトル<TreeNodeの*> ANS; //のために(iはLを= int型; I <= R; ++ i)は //のために(*ツリーノード左:generateTrees(L、I - 1)) //(ツリーノード*右ため:generateTrees(I + 1、R )){ // ans.push_back(新しいツリーノード(I))。 // ans.back() - >左=左。 // ans.back() - >右=右。 //} ANSを返す//; //} //}。 空printTree(TreeNodeの* TMP) { 場合(TMP == nullptr) リターン。 他{ coutの<< tmp->ヴァル。 printTree(tmp->左)。 printTree(tmp->右)。 } } int型のmain() { ソリューションS1。 INT、N = 3。 // cinを>> N; ベクター<ツリーノード*> ANS = s1.generateTrees(N)。 (自動I:ANS)は { printTree(I)。 coutの<<てendl; } 0を返します。 }