国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Leetcode 114. Flatten Binary Tree to Linked List

2019-11-14 12:00:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Given a binary tree, flatten it to a linked list in-place.

For example, Given

1 / / 2 5 / / / 3 4 6

The flattened tree should look like:

1 / 2 / 3 / 4 / 5 / 6

s思路: 1. 看起來(lái),是先訪問中間,然后左邊,最后右邊。又是一個(gè)PRe-order. 2. 用recursive當(dāng)然最簡(jiǎn)單。左邊f(xié)latten,右邊f(xié)latten,然后讓root指向flatten后的左邊,讓flatten的左邊的尾節(jié)點(diǎn)指向flatten后的右邊。也就是說(shuō),在flatten過程中需要知道頭節(jié)點(diǎn)和尾節(jié)點(diǎn)的指針! 3. 由于要得到左子樹和右子樹的開頭結(jié)尾,所以需要開頭結(jié)尾指針從底層得到給上層使用,因此用reference! 4. 用iterative很有意思,用stack很麻煩,反而不用stack的morris比較方便快捷,由于是pre-order:根左右,傳統(tǒng)的方法,訪問了左邊還要回到根以便訪問右邊,所以必須用stack;morris則是換一個(gè)角度來(lái)看問題,把樹臨時(shí)改變一下結(jié)構(gòu):在每個(gè)root時(shí),先找到左子樹的最右節(jié)點(diǎn),然后讓這個(gè)最右節(jié)點(diǎn)指向右子樹的第一個(gè)節(jié)點(diǎn),這就方便了,等訪問完左子樹,就直接訪問右節(jié)點(diǎn)! 這里寫圖片描述 z正常情況下使用morris,還需要在建立這個(gè)輔助的連接后拆除這個(gè)連接以還原樹的本來(lái)結(jié)構(gòu),但這道題就要求改變樹的結(jié)構(gòu),所以說(shuō),用morris剛剛好!

//方法1:recursive:pre-order。class Solution {public: void helper(TreeNode*& head,TreeNode*& tail) { // if(!head) return; TreeNode* h1=head->left,*h2=head->right; TreeNode* t1=NULL,*t2=NULL; helper(h1,t1); helper(h2,t2); if(!h1&&!h2){ tail=head; }else{ head->left=NULL; head->right=h1?h1:h2; if(h1) t1->right=h2; tail=h2?t2:t1; } } void flatten(TreeNode* root) { // TreeNode* tail=NULL; helper(root,tail); }};//方法2:iterative:用stack的方法很復(fù)雜。參考了網(wǎng)上的用o(1)的morris的方法://https://discuss.leetcode.com/topic/3995/share-my-simple-non-recursive-solution-o-1-space-complexityclass Solution {public: void flatten(TreeNode* root) { // TreeNode* cur=root; while(cur){ if(cur->left){ TreeNode* pre=cur->left; while(pre->right){ pre=pre->right; } pre->right=cur->right;//把左子樹和右子樹先連接起來(lái),這樣就不用stack,聰明! cur->right=cur->left; cur->left=NULL; } cur=cur->right; } }};
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 扶风县| 上蔡县| 武穴市| 海原县| 香河县| 望谟县| 商都县| 防城港市| 瑞丽市| 台州市| 潞城市| 汶川县| 娄底市| 巫山县| 安庆市| 永平县| 岚皋县| 南京市| 大悟县| 盐津县| 祥云县| 琼海市| 陆丰市| 新安县| 宜宾县| 新田县| 铅山县| 南岸区| 黄骅市| 尼木县| 寿宁县| 永康市| 富平县| 辽阳县| 左贡县| 吴忠市| 靖远县| 集贤县| 黄浦区| 湘阴县| 余姚市|