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

首頁 > 學院 > 開發設計 > 正文

Leetcode 114. Flatten Binary Tree to Linked List

2019-11-14 11:59:34
字體:
來源:轉載
供稿:網友

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. 看起來,是先訪問中間,然后左邊,最后右邊。又是一個PRe-order. 2. 用recursive當然最簡單。左邊flatten,右邊flatten,然后讓root指向flatten后的左邊,讓flatten的左邊的尾節點指向flatten后的右邊。也就是說,在flatten過程中需要知道頭節點和尾節點的指針! 3. 由于要得到左子樹和右子樹的開頭結尾,所以需要開頭結尾指針從底層得到給上層使用,因此用reference! 4. 用iterative很有意思,用stack很麻煩,反而不用stack的morris比較方便快捷,由于是pre-order:根左右,傳統的方法,訪問了左邊還要回到根以便訪問右邊,所以必須用stack;morris則是換一個角度來看問題,把樹臨時改變一下結構:在每個root時,先找到左子樹的最右節點,然后讓這個最右節點指向右子樹的第一個節點,這就方便了,等訪問完左子樹,就直接訪問右節點! 這里寫圖片描述 z正常情況下使用morris,還需要在建立這個輔助的連接后拆除這個連接以還原樹的本來結構,但這道題就要求改變樹的結構,所以說,用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的方法很復雜。參考了網上的用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;//把左子樹和右子樹先連接起來,這樣就不用stack,聰明! cur->right=cur->left; cur->left=NULL; } cur=cur->right; } }};
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金秀| 巴马| 化州市| 湖州市| 托克托县| 平凉市| 仁化县| 滦平县| 仙游县| 盱眙县| 绥宁县| 蒙阴县| 庐江县| 泰宁县| 个旧市| 义马市| 台南县| 东明县| 手机| 长泰县| 商城县| 静宁县| 涞水县| 阆中市| 乌海市| 宜都市| 霞浦县| 乐陵市| 海宁市| 湖口县| 兴海县| 开远市| 绍兴县| 武山县| 延长县| 巴彦县| 日喀则市| 偏关县| 大连市| 汝南县| 临澧县|