C++實(shí)現(xiàn)LeetCode(114.將二叉樹(shù)展開(kāi)成鏈表)
[LeetCode] 114. Flatten Binary Tree to Linked List 將二叉樹(shù)展開(kāi)成鏈表
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
Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order trave
這道題要求把二叉樹(shù)展開(kāi)成鏈表,根據(jù)展開(kāi)后形成的鏈表的順序分析出是使用先序遍歷,那么只要是數(shù)的遍歷就有遞歸和非遞歸的兩種方法來(lái)求解,這里我們也用兩種方法來(lái)求解。首先來(lái)看遞歸版本的,思路是先利用 DFS 的思路找到最左子節(jié)點(diǎn),然后回到其父節(jié)點(diǎn),把其父節(jié)點(diǎn)和右子節(jié)點(diǎn)斷開(kāi),將原左子結(jié)點(diǎn)連上父節(jié)點(diǎn)的右子節(jié)點(diǎn)上,然后再把原右子節(jié)點(diǎn)連到新右子節(jié)點(diǎn)的右子節(jié)點(diǎn)上,然后再回到上一父節(jié)點(diǎn)做相同操作。代碼如下:
解法一:
class Solution {
public:
void flatten(TreeNode *root) {
if (!root) return;
if (root->left) flatten(root->left);
if (root->right) flatten(root->right);
TreeNode *tmp = root->right;
root->right = root->left;
root->left = NULL;
while (root->right) root = root->right;
root->right = tmp;
}
};
例如,對(duì)于下面的二叉樹(shù),上述算法的變換的過(guò)程如下:
1
/ \
2 5
/ \ \
3 4 6
1
/ \
2 5
\ \
3 6
\
4
1
\
2
\
3
\
4
\
5
\
6
下面再來(lái)看非迭代版本的實(shí)現(xiàn),這個(gè)方法是從根節(jié)點(diǎn)開(kāi)始出發(fā),先檢測(cè)其左子結(jié)點(diǎn)是否存在,如存在則將根節(jié)點(diǎn)和其右子節(jié)點(diǎn)斷開(kāi),將左子結(jié)點(diǎn)及其后面所有結(jié)構(gòu)一起連到原右子節(jié)點(diǎn)的位置,把原右子節(jié)點(diǎn)連到元左子結(jié)點(diǎn)最后面的右子節(jié)點(diǎn)之后。代碼如下:
解法二:
class Solution {
public:
void flatten(TreeNode *root) {
TreeNode *cur = root;
while (cur) {
if (cur->left) {
TreeNode *p = cur->left;
while (p->right) p = p->right;
p->right = cur->right;
cur->right = cur->left;
cur->left = NULL;
}
cur = cur->right;
}
}
};
例如,對(duì)于下面的二叉樹(shù),上述算法的變換的過(guò)程如下:
1
/ \
2 5
/ \ \
3 4 6
1
\
2
/ \
3 4
\
5
\
6
1
\
2
\
3
\
4
\
5
\
6
前序迭代解法如下:
解法三:
class Solution {
public:
void flatten(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode *t = s.top(); s.pop();
if (t->left) {
TreeNode *r = t->left;
while (r->right) r = r->right;
r->right = t->right;
t->right = t->left;
t->left = NULL;
}
if (t->right) s.push(t->right);
}
}
};
此題還可以延伸到用中序,后序,層序的遍歷順序來(lái)展開(kāi)原二叉樹(shù),分別又有其對(duì)應(yīng)的遞歸和非遞歸的方法,有興趣的童鞋可以自行實(shí)現(xiàn)。
Github 同步地址:
https://github.com/grandyang/leetcode/issues/114
類似題目:
Flatten a Multilevel Doubly Linked List
參考資料:
https://leetcode.com/problems/flatten-binary-tree-to-linked-list/
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(114.將二叉樹(shù)展開(kāi)成鏈表)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)將二叉樹(shù)展開(kāi)成鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)二叉樹(shù)基本操作詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)二叉樹(shù)基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
構(gòu)造函數(shù)定義為private或者protected的好處
從語(yǔ)法上來(lái)講,一個(gè)函數(shù)被聲明為protected或者private,那么這個(gè)函數(shù)就不能從“外部”直接被調(diào)用了。對(duì)于protected的函數(shù),子類的“內(nèi)部”的其他函數(shù)可以調(diào)用之。而對(duì)于private的函數(shù),只能被本類“內(nèi)部”的其他函數(shù)說(shuō)調(diào)用2013-10-10
利用C語(yǔ)言實(shí)現(xiàn)經(jīng)典游戲斗獸棋
《斗獸棋》是一款棋類游戲,整個(gè)游戲畫(huà)面是分為兩塊區(qū)域,中間有河流分割兩塊區(qū)域,有橋梁可以讓彼此的動(dòng)物過(guò)河,要取得勝利,必須占領(lǐng)那一邊動(dòng)物的巢穴獲勝利。本文將用C語(yǔ)言實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-03-03
C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡連接檢測(cè)的方法
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡連接檢測(cè)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

