題目詳情:
解題思路:
這題要求根據陣列構建二叉樹,那就構吧。初步是這樣想的:
1、從陣列裡選乙個元素構建新的根節點
2、從陣列裡選兩個元素作為上述節點的左右孩子節點
3、遍歷完整個陣列為止。
step1:該如何選擇節點作為根節點?
題目中提到了要求構建的二叉樹是高度平衡的二叉樹,而題目給出的陣列是公升序。那如果我取陣列nums[start,end]的中間nums[mid]元素作為根節點,左右兩邊的元素數量差最多是1。剛好可以滿足題目要求的高度平衡。
step2:該如何選擇根節點的左右孩子節點?
選取的nums[mid]把陣列分成了左右兩個部分,把左右兩個部分單獨處理,即
左邊範圍是[0,mid-1],右邊範圍是[mid+1,nums.length-1]
假設題目給的陣列範圍是[0,mid-1],選取的根節點步驟是和step1一模一樣,只是陣列大小不同而已。
因此在左邊範圍一樣取中間元素作為step1中根節點的左孩子,右邊範圍取中間元素作為step1中根節點的右孩子
step3:啥時候停止?
因為需要不斷更新使用陣列的範圍,確保節點的構建,所以start會增加而end會減少,當start>end時,就停止生成節點,也就是停止遞迴。
結合**看,更好理解
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
treenode* helper(vector& nums,int start,int end)
//取中間元素
int midindex=start+(end-start)/2;
int curnum=nums[midindex];
treenode* node=new treenode(curnum);//構建根節點
//左孩子
node->left=helper(nums,start,midindex-1);//更新陣列使用範圍
//右孩子
node->right=helper(nums,midindex+1,end);//更新陣列使用範圍
return node; }};
根據這道題,可以關聯到其他題,解法是一樣的,如下圖所示
108 將有序陣列轉換為二叉搜尋樹
將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 3 9 10...
108 將有序陣列轉換為二叉搜尋樹
詳見乙個老外的的discuss。這道題考察的其實是二分查詢的知識。二叉搜尋樹的中序遍歷是乙個遞增有序序列,而中序遍歷是左根右,即根在中序遍歷的中間,則可以由中序遍歷的序列找到根的位置。找到根的位置後,將原序列分為兩個子串行,則再在每個子串行中找根。另外,從該題中還可以學到一種leetcode中初始化...
Letcode 108 將有序陣列轉換為二叉搜尋樹
題目 將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。此題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過1。示例 給定有序陣列 10,3,0,5,9 一種可行答案是 0,3,9,10,null,5 它可以表示成下面這個高度平衡二叉搜尋樹 0 3 9 1...