日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

构造最大的二叉树

發布時間:2024/4/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 构造最大的二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

遞歸法(容器分割)

前序遍歷先構造中間結點,然后遞歸構造左子樹和右子樹

1、確定遞歸函數的參數和返回值
參數就是傳?的是存放元素的數組,返回該數組構造的?叉樹的頭結點,返回類型是指向節點的指針。

TreeNode* constructMaximumBinaryTree(vector<int>& nums)

2、確定終?條件
題?中說了輸?的數組???定是?于等于1的,所以我們不?考慮?于1的情況,那么當遞歸遍歷的時候,如果傳?的數組??為1,說明遍歷到了葉?節點了。
那么應該定義?個新的節點,并把這個數組的數值賦給新的節點,然后返回這個節點。 這表示?個數組??是1的時候,構造了?個新的節點,并返回。

TreeNode* node = new TreeNode(0); if (nums.size() == 1) {node->val = nums[0];return node; }

3、確定單層遞歸的邏輯
這?有三步?作
1.先要找到數組中最?的值和對應的下表,最?的值構造根節點,下表?來下?步分割數組。代碼如下:

int maxValue = 0; int maxValueIndex = 0; for (int i = 0; i < nums.size(); i++) {if (nums[i] > maxValue) {maxValue = nums[i];maxValueIndex = i;} } TreeNode* node = new TreeNode(0); node->val = maxValue;

2、最?值所在的下表左區間構造左?樹
這?要判斷maxValueIndex > 0,因為要保證左區間?少有?個數值。

if (maxValueIndex > 0) {vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);node->left = constructMaximumBinaryTree(newVec);}

3、最?值所在的下表右區間構造右?樹
判斷maxValueIndex < (nums.size() - 1),確保右區間?少有?個數值。代碼如下:

if (maxValueIndex < (nums.size() - 1)) {vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());node->right = constructMaximumBinaryTree(newVec); } class Solution{ public:TreeNode*constructMaximumBinaryTree(vector<int>&nums) {TreeNode*node=newTreeNode(0);if(nums.size()==1) {node->val=nums[0];return node;}//找到數組中最?的值和對應的下表int maxValue=0;int maxValueIndex=0;for(int i=0;i<nums.size();i++) {if(nums[i]>maxValue) {maxValue=nums[i];//更新最大值maxValueIndex=i;//更新下標} }node->val=maxValue;//最?值所在的下表左區間構造左?樹if(maxValueIndex>0) {vector<int>newVec(nums.begin(),nums.begin()+maxValueIndex);node->left=constructMaximumBinaryTree(newVec);}//最?值所在的下表右區間構造右?樹if(maxValueIndex<(nums.size()-1)) {vector<int>newVec(nums.begin()+maxValueIndex+1,nums.end());node->right=constructMaximumBinaryTree(newVec);}return node;} }

遞歸法(下表索引分割)

初級

class Solution { public:// 在左閉右開區間[left, right),構造?叉樹TreeNode* traversal(vector<int>& nums,int begin,int end){if(begin>=end) return NULL;//當區間開始位置大于結束位置,不合法;等于結束位置說明為空//找出給定區間的最大值int maxValue=0;for(int ii=begin;ii<end;ii++){if(nums[ii]>maxValue) {maxValue=nums[ii];}}//找出切割點int delimit;for(delimit=begin;delimit<end;delimit++){if(nums[delimit]==maxValue) break;}TreeNode* root=new TreeNode(maxValue);if(end-begin==1) return root;root->left=traversal(nums,begin,delimit);root->right=traversal(nums,delimit+1,end);return root;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return traversal(nums,0,nums.size());} };

中級

class Solution { public:// 在左閉右開區間[left, right),構造?叉樹TreeNode* traversal(vector<int>& nums,int begin,int end){if(begin>=end) return NULL;//當區間開始位置大于結束位置,不合法;等于結束位置說明為空//找出給定區間的最大值int maxValue=0;int delimit=0;for(int ii=begin;ii<end;ii++){if(nums[ii]>maxValue){maxValue=nums[ii];delimit=ii; }}TreeNode* root=new TreeNode(maxValue);if(end-begin==1) return root;root->left=traversal(nums,begin,delimit);root->right=traversal(nums,delimit+1,end);return root;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return traversal(nums,0,nums.size());} };

高級

class Solution { private:// 在左閉右開區間[begin, end),構造?叉樹TreeNode* traversal(vector<int>& nums, int begin, int end) {if (begin >= end) return nullptr;// 分割點下表: maxValueIndexint maxValueIndex = begin;for (int i = begin + 1; i < end; ++i) {if (nums[i] > nums[maxValueIndex]) maxValueIndex = i;}TreeNode* root = new TreeNode(nums[maxValueIndex]);// 左閉右開: [begin, maxValueIndex)root->left = traversal(nums, begin, maxValueIndex);// 左閉右開: [maxValueIndex + 1, end)root->right = traversal(nums, maxValueIndex + 1, end);return root; } public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return traversal(nums, 0, nums.size());} }; 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的构造最大的二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。