給定乙個不含重複元素的整數陣列 nums 。乙個以此陣列直接遞迴構建的 最大二叉樹 定義如下:
1.二叉樹的根是陣列 nums 中的最大元素。
2.左子樹是通過陣列中 最大值左邊部分 遞迴構造出的最大二叉樹。
3.右子樹是通過陣列中 最大值右邊部分 遞迴構造出的最大二叉樹。
示例 1:
輸入:nums = [3,2,1,6,0,5]
輸出:[6,3,5,null,2,0,null,null,1]
示例2:
輸入:nums = [3,2,1]
輸出:[3,null,2,null,1]
首先理解題目的意思,我們需要用陣列中的元素來構建二叉樹。既然題目都說到了遞迴構建二叉樹,那麼我們可以用遞迴的方法來構建。
我們可以定義這樣乙個遞迴函式來構建二叉樹:
首先我們需要遍歷當前陣列,找出當前陣列中最大值的位置和大小,將當前陣列最大值賦給二叉樹的根節點。之後將最大值左邊的陣列存入乙個新的陣列,我們暫將這個新的陣列稱為left陣列。將最大值右邊的陣列存入乙個新的陣列,我們暫將這個新的陣列稱為right陣列。在生成left陣列和right陣列之後,我們還需要定義兩個新的二叉樹子節點,用來遞迴生成最大二叉樹。有了left和right陣列後,遞迴呼叫當前這個函式來生成最大二叉樹,在當前呼叫函式開頭加上返回條件:若當前陣列的長度為0則返回當前樹的節點為nullptr。呼叫函式的引數有兩個,乙個是指向樹節點位址的指標,乙個是存放陣列元素的容器變數。
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
vector<
int> left;
vector <
int> right;
int max=nums[0]
;//當前陣列最大值
int index=0;
//當前陣列最大值索引
for(
int i=
0;isize()
;i++)}
root-
>val=max;
for(
int i=
0;ifor(
int i=index+
1;isize()
;i++)}
order
(left,root-
>left)
;order
(right,root-
>right)
;return;}
treenode*
constructmaximumbinarytree
(vector<
int>
& nums)
vector <
int> left;
vector <
int> right;
int max=nums[0]
;//當前陣列最大值
int index=0;
//當前陣列最大值索引
for(
int i=
0;isize()
;i++)}
treenode* root=
newtreenode
(max)
;for
(int i=
0;ifor(
int i=index+
1;isize()
;i++)}
order
(left,root-
>left)
;order
(right,root-
>right)
;return root;}}
;
其實本題的解題思路還是比較簡單的,關鍵在於看怎麼實現**能夠減少時間複雜度和空間複雜度。對於作者這部分的**,作者認為在時間複雜度上和空間複雜度上還可以進行提公升,由於本人能力和時間有限並沒有做優化,只是提供了一種方法。 每日刷題 最大二叉樹
給定乙個不含重複元素的整數陣列。乙個以此陣列構建的最大二叉樹定義如下 二叉樹的根是陣列中的最大元素。左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。示例 輸入 3,2,1,6,0,5 輸出 ...
LeetCode 最大二叉樹
q 給定乙個不含重複元素的整數陣列。乙個以此陣列構建的最大二叉樹定義如下 二叉樹的根是陣列中的最大元素。左子樹是通過陣列中最大值左邊部分構造出的最大二叉樹。右子樹是通過陣列中最大值右邊部分構造出的最大二叉樹。通過給定的陣列構建最大二叉樹,並且輸出這個樹的根節點。示例 輸入 3,2,1,6,0,5 輸...
最大二叉樹
題目大意 總是按照當前陣列或者子陣列中的元素值的最大值作為根節點,依次建立一顆二叉樹。輸入 nums 3 2,1 6,0 5 輸出 6,3,5,null,2,0,null,null,1 解釋 遞迴呼叫如下所示 3,2,1,6,0,5 中的最大值是 6 左邊部分是 3,2,1 右邊部分是 0,5 3,...