1. 程式人生 > >leetcode:654最大二叉樹(C++)

leetcode:654最大二叉樹(C++)

給定一個不含重複元素的整數陣列。一個以此陣列構建的最大二叉樹定義如下:

1.二叉樹的根是陣列中的最大元素。 2.左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。 3.右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。 4.通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。 例如: 在這裡插入圖片描述 思路: 我們先找到數組裡面的最大數,把他設定為根節點,然後遞迴傳入最大數的左邊的陣列,然後繼續找最大的數,然後繼續遞迴傳入,直到他的左等於右返回NULL,然後遞迴查詢最大數右邊的節點,遞迴完畢返回

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return maxtree(nums,0,nums.size()-1);
    }
    TreeNode *maxtree(const vector<int>nums,int left,int right)
    {
        if(left>right)
            return NULL;
        int max=nums[left];//每次從num傳入的left開始
        int index=left;//index標記最大數的位置
        for(int i=left;i<=right;i++)
        {
            if(nums[i]>max)
            {
                max=nums[i];//max為最大數
                index=i;//max的下標
            }
        }
        TreeNode *root=new TreeNode(max);
        root->left=maxtree(nums,left,index-1);//遞迴返回max的左邊陣列
        root->right=maxtree(nums,index+1,right);//遞迴返回max右邊的陣列
        return root;
    }
};