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),普通二叉樹的屬性還是要具體問題具體分析。
一刷掌握遞歸。