Leetcode問題解決レポート最大のバイナリツリーシリーズ

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;
    }
};

おすすめ

転載: blog.csdn.net/qq_43477024/article/details/111939576