和我一起在LeetCode刷題吧(每天一題LeetCode)

分類標(biāo)簽:鏈表? ? ? ? ? ? ? ?

難易度:中等

題目描述:

將一個按照升序排列的有序數(shù)組,轉(zhuǎn)換為一棵高度平衡二叉搜索樹。本題中,一個高度平衡二叉樹是指一個二叉樹每個節(jié)點(diǎn)?的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定有序數(shù)組: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:

? ? ? 0

? ? / \

? -3? 9

? /? /

-10? 5

思路:轉(zhuǎn)換成數(shù)組+二分法+遞歸

1.利用空間使用更多的空間來降低時間的復(fù)雜度;

2.在遞歸過程中對鏈表的制作處理會比較繁瑣,將鏈表轉(zhuǎn)換成數(shù)組,并將該鏈表構(gòu)成的數(shù)組的頭和尾分別命名為left和right;

3.利用二分法尋找二叉樹搜索樹的根節(jié)點(diǎn)

代碼:

struct TreeNode *numTranslate(int *num,int left,int right)

{

? ? if(left>right)

? ? ? ? return NULL;

? ? int mid=(left+right)/2;

? ? struct TreeNode * res=(struct TreeNode *)malloc(sizeof(struct TreeNode));

? ? res->val=num[mid];

? ? res->left=numTranslate(num,left,mid-1);

? ? res->right=numTranslate(num,mid+1,right);

? ? return res;

}

struct TreeNode* sortedListToBST(struct ListNode* head){

struct ListNode *cur=head;

? ? int count=0,k=0;

? ? while(cur!=NULL)

? ? {

? ? ? ? count++;

? ? ? ? cur=cur->next;

? ? }

? ? cur=head;

? int * num=(int *)calloc(sizeof(int),count);

? ? while(cur!=NULL)

? ? {

? ? ? num[k++]=cur->val;

? ? ? ? cur=cur->next;

? ? }

return numTranslate(num,0,count-1);

}

運(yùn)行結(jié)果:


程序生成的二叉樹


程序損耗的時間和空間
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容