這是悅樂書的第166次更新,第168篇原創(chuàng)
01 看題和準備
今天介紹的是LeetCode算法題中Easy級別的第25題(順位題號是108)。給定一個數組,其中元素按升序排序,將其轉換為高度平衡的二叉搜索樹。例如:
給定排序數組:[ -10,-3, 0, 5, 9]
一個可能的答案是:[0,-3, 9,-10,null,5],它代表以下高度平衡的二叉搜索樹:
0
/ \
-3 9
/ /
-10 5
本次解題使用的開發(fā)工具是eclipse,jdk使用的版本是1.8,環(huán)境是win7 64位系統(tǒng),使用Java語言編寫和測試。
02 相關概念
在探討如何解題前,我們先把題目中的兩個概念弄清楚。
二叉搜索樹,是一棵空樹,或者是具有下列性質的二叉樹:
1)若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值
2)若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值
3)任意節(jié)點的左、右子樹也分別為二叉搜索樹
總結一下就是任意節(jié)點的值始終滿足 左節(jié)點值 < 根節(jié)點值 < 右節(jié)點值 這個條件。
平衡二叉樹,是一顆空樹,或者具有下列性質的二叉樹:
1)左子樹是一顆二叉平衡樹
2)右子樹是一顆二叉平衡樹
3)左右兩個子樹的高度差的絕對值不超過1
總結一下就是 |左子樹層數-右子樹層數| <= 1 。
另外,我們再來了解下二叉樹中序遍歷這個概念,這對我們解題會有所幫助。
中序遍歷,如果二叉樹不為空,則會首先遍歷左子樹,然后訪問根節(jié)點,最后遍歷右子樹。
A
/ \
B C
/ \ /
D E F
上面的二叉樹中序遍歷的結果是:DBEAFC 。
03 解題
我們發(fā)現那個給出的示例數組,其實就是那個二叉平衡搜索樹的中序遍歷結果,數組的中間值就是二叉樹的根節(jié)點,往前就是左子樹,往后就是右子樹,所以我們可以借助二分法,將數組分為三部分,第一部分從首位到中間位,第二部分是中間位,第三部分是中間位到尾位,利用這三部分分別遞歸給二叉樹設值即可。
public TreeNode sortedArrayToBST(int[] nums) {
return addNode(nums, 0, nums.length-1);
}
public TreeNode addNode(int[] nums, int left, int right){
if (left > right) {
return null;
}
int mid = (right + left)/2;
TreeNode t = new TreeNode(nums[mid]);
t.left = addNode(nums, left, mid-1);
t.right = addNode(nums, mid+1, right);
return t;
}
04 小結
以上就是全部內容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發(fā)就是對我最大的回報和支持!