Leetcode最大のバイナリツリーシリーズ
654.最大のバイナリツリー
繰り返される要素のない整数配列が与えられます。この配列から構築される最大バイナリツリーは、次のように定義されます。
- バイナリツリーのルートは、配列内の最大の要素です。
- 左側のサブツリーは、配列の最大値の左側から構築された最大のバイナリツリーです。
- 右側のサブツリーは、配列の最大値の右側から構築された最大のバイナリツリーです。
- 指定された配列から最大のバイナリツリーを構築し、このツリーのルートノードを出力します。
输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:
6
/ \
3 5
\ /
2 0
\
1
回答:
考え方はとてもシンプルで、まず最大値を見つけて、左のサブツリーを左に、右のサブツリーを右に配置します。なぜブログを書きたいのかというと、再帰的よりも反復的に書くほうがいいと思うので、再帰的に書いてみたいと思います。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* construct(vector<int>&nums,int l,int r){
int maxnum=l;
if(l>r)
return nullptr;
for(int i=l+1;i<=r;++i){
if(nums[i]>nums[maxnum])
maxnum=i;
}
TreeNode* temp=new TreeNode(nums[maxnum]);
temp->left=construct(nums,l,maxnum-1);
temp->right=construct(nums,maxnum+1,r);
return temp;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* ans=construct(nums,0,nums.size()-1);
return ans;
}
};
998.最大のバイナリツリーII
最大ツリー定義:各ノードの値がそのサブツリー内の他の値よりも大きいツリー。
最大ツリーのルートノードルートを指定します。
前の質問と同様に、指定されたツリーは、次のConstruct(A)ルーチンを使用して、テーブルA(root = Construct(A))から再帰的に構築されます。
- Aが空の場合、nullを返します
- それ以外の場合は、A [i]をAの最大要素とします。値A [i]でルートノードルートを作成します
- ルートの左側のサブツリーは、Construct([A [0]、A [1]、…、A [i-1]])として作成されます。
- ルートの右側のサブツリーは、Construct([A [i + 1]、A [i + 2]、…、A [A.length-1]])として作成されます。
- ルートに戻る
Aを直接指定したのではなく、ルートノードroot = Construct(A)を1つだけ指定したことに注意してください。
BがAのコピーであり、値valが追加されているとします。Bの値が異なることを確認してください。
Construct(B)を返します。
回答:
この質問は前の質問を変形したものです。最後に値を挿入してこのツリーを再構築できるようにします。ここでは検索ツリーだと思います。長い間考えていました。踏むのは簡単
(追記:再帰コードは本当に単純です...)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoMaxTree(TreeNode* root, int val) {
if(val>=root->val){
root=new TreeNode(val,root,nullptr);
}
else {
if(root->right==nullptr)
root->right=new TreeNode(val);
else
root->right=insertIntoMaxTree(root->right,val);
}
return root;
}
};