代碼隨想錄第二十三天| 669. 修剪二叉搜索樹、108.將有序數(shù)組轉(zhuǎn)換為二叉搜索樹、538.把二叉搜索樹轉(zhuǎn)換為累加樹、總結(jié)

669. 修剪二叉搜索樹(二刷注意)

思路:

類似刪除二叉搜索樹的節(jié)點(diǎn),如果root->val不在范圍內(nèi)則刪除節(jié)點(diǎn),注意需要按照左右中的順序,先處理左子樹里的不符合的節(jié)點(diǎn)再處理右子樹不符合的節(jié)點(diǎn),最后處理root節(jié)點(diǎn)。按照中左右如果中處理完直接return的話,在中有問題的情況下,沒有處理左右子樹就直接return了。

看視頻后:

終止條件:root==NULL

如果val<low,則需要遍歷確認(rèn)root的右子樹是否符合條件(右子樹里可能有不符合條件的值,因此需要遍歷),返回右子樹給上一層父節(jié)點(diǎn)(通過后面的遍歷承接)

如果val>high,則需要遍歷root的左子樹是否符合條件(左子樹里可能有不符合條件的值,因此需要遍歷),返回左子樹給上一層父節(jié)點(diǎn)(通過后面的遍歷承接)

遍歷左子樹和遍歷右子樹,返回root;



108.將有序數(shù)組轉(zhuǎn)換為二叉搜索樹

思路:

終止條件:nums.size()==0

根節(jié)點(diǎn)建立:使用數(shù)組中間的數(shù)建立根節(jié)點(diǎn)

分成左右兩個(gè)數(shù)組:

vector<int>?left(nums.begin(),nums.begin()+rootnum);

vector<int>?right(nums.begin()+rootnum+1,nums.end());

左節(jié)點(diǎn)對(duì)左數(shù)組進(jìn)行函數(shù)遍歷,右節(jié)點(diǎn)對(duì)有數(shù)組進(jìn)行函數(shù)遍歷

最后返回根節(jié)點(diǎn);

看視頻后:

構(gòu)造節(jié)點(diǎn)都是從中間開始構(gòu)造,切割左右區(qū)間,注意區(qū)間的統(tǒng)一性。


538.把二叉搜索樹轉(zhuǎn)換為累加樹

思路:

用雙指針法,建立pre。

根據(jù)題目描述和示例發(fā)現(xiàn)遍歷順序?yàn)橛抑凶蟆?/p>

終止條件:root==NULL

右:root->right=convertBST(root->right);

中:如果pre不為空,進(jìn)行累加

if(pre!=NULL)

????????{

????????????root->val+=pre->val;

????????}

????????pre=root;

左:root->left=convertBST(root->left);

最后 return root;

看視頻后:

可以用int pre避免訪問空指針的問題;


總結(jié):

二叉樹的題目要想到:返回值、參數(shù)是什么?終止條件是什么?單層邏輯是什么?

涉及到二叉樹的構(gòu)造,無論普通二叉樹還是二叉搜索樹一定前序,都是先構(gòu)造中節(jié)點(diǎn)。

求普通二叉樹的屬性,一般是后序,一般要通過遞歸函數(shù)的返回值做計(jì)算。

求二叉搜索樹的屬性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉樹的屬性中,我用的是一般為后序,例如單純求深度就用前序,為了方便讓父節(jié)點(diǎn)指向子節(jié)點(diǎn),普通二叉樹的屬性還是要具體問題具體分析。

一刷掌握遞歸。

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

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

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