武漢營銷型網(wǎng)站建設(shè)百度seo排名培訓(xùn)
給你二叉樹的根結(jié)點(diǎn)?root
?,請你將它展開為一個單鏈表:
- 展開后的單鏈表應(yīng)該同樣使用?
TreeNode
?,其中?right
?子指針指向鏈表中下一個結(jié)點(diǎn),而左子指針始終為?null
?。 - 展開后的單鏈表應(yīng)該與二叉樹?先序遍歷?順序相同。
示例 1:
輸入:root = [1,2,5,3,4,null,6] 輸出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
輸入:root = [] 輸出:[]
示例 3:
輸入:root = [0] 輸出:[0]
提示:
- 樹中結(jié)點(diǎn)數(shù)在范圍?
[0, 2000]
?內(nèi) -100 <= Node.val <= 100
進(jìn)階:你可以使用原地算法(O(1)
?額外空間)展開這棵樹嗎?
思路:
按照題目給的例子來說
先把1-5這個鏈子斷掉,存儲一下5-6
然后把1-2斷掉,以2為頭結(jié)點(diǎn)的存儲到1的右節(jié)點(diǎn)去,找到以2為頭結(jié)點(diǎn)的最右結(jié)點(diǎn),把5接在后面。
然后繼續(xù)重復(fù)這樣的操作。
文字說不清楚,可以看下參考圖:
?代碼:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void flatten(TreeNode* root) {//if(!root)return;TreeNode* p=root;while(p){if(p->left){TreeNode* t=p->right;p->right=p->left;p->left=nullptr;TreeNode* q=p;while(q->right){if(q->right)q=q->right;}q->right=t;}p=p->right;}}
};