构造最大的二叉树
遞歸法(容器分割)
前序遍歷先構造中間結點,然后遞歸構造左子樹和右子樹
1、確定遞歸函數的參數和返回值
參數就是傳?的是存放元素的數組,返回該數組構造的?叉樹的頭結點,返回類型是指向節點的指針。
2、確定終?條件
題?中說了輸?的數組???定是?于等于1的,所以我們不?考慮?于1的情況,那么當遞歸遍歷的時候,如果傳?的數組??為1,說明遍歷到了葉?節點了。
那么應該定義?個新的節點,并把這個數組的數值賦給新的節點,然后返回這個節點。 這表示?個數組??是1的時候,構造了?個新的節點,并返回。
3、確定單層遞歸的邏輯
這?有三步?作
1.先要找到數組中最?的值和對應的下表,最?的值構造根節點,下表?來下?步分割數組。代碼如下:
2、最?值所在的下表左區間構造左?樹
這?要判斷maxValueIndex > 0,因為要保證左區間?少有?個數值。
3、最?值所在的下表右區間構造右?樹
判斷maxValueIndex < (nums.size() - 1),確保右區間?少有?個數值。代碼如下:
遞歸法(下表索引分割)
初級
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年技術見證,附贈技術全景圖總結
- 上一篇: 如何根据两个顺序构造⼀个唯⼀的⼆叉树?
- 下一篇: 合并两个二叉树