給定乙個二叉樹,原地將它展開為乙個單鏈表。
例:
輸入:
1
/ \ 2
5/ \ \34
6
輸出:
1
\ 2\3
\4\5
\6
題目要求是將二叉樹展開為單鏈表(使用樹節點的右指標連線)。一種解決方案是,對於每個子樹採用中序遍歷,先將左子樹轉換為單鏈表,然後將它插入到根節點和其右子樹之間,最後將右子樹轉換為單鏈表。以例子中的樹為例,轉化過程如下:
(1)將以3為根節點的子樹轉換成單鏈表。
(2)將上一步生成的單鏈表插入到它的父節點和兄弟節點之間。
(3)將以4為根節點的子樹轉換成單鏈表。
(4)將左子樹單鏈表插入到根節點和右子樹之間。
(5)轉換右子樹。
轉換過程中,記得將每個節點的左指標置為nullptr
.
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution};
void
flatten
(treenode* root)
data solve
(treenode *root)
treenode *reshead = root;
treenode *restail = root;
treenode *tmpr = root-
>right;
data ld =
solve
(root-
>left);if
(ld.tail)
data rd =
solve
(tmpr);if
(rd.tail)
return
data
(reshead, restail);}
};
該題也可以通過後序遍歷的方式求解,即先將左子樹和右子樹分別轉換成單鏈表,最後將左鍊錶插入到根節點和右鍊錶之間。實現方式和中序遍歷類似。
筆者在實現**的時候,定義了乙個類,用於描述每個子樹轉換成的單鏈表的頭指標和尾指標。這樣做是為了方便使用左右子樹鍊錶構建整棵樹鍊錶。
將二叉樹轉換成雙向鍊錶的做法和本題類似。只不過涉及到了更複雜的指標操作。
leetcode 劍指offer 36:二叉搜尋樹與雙向鍊錶
二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 將其展開為 以根節點為基準,先處理左子樹,然後處理右子樹,當其左右子樹均轉化為鍊錶之後,再處理以該根節點所代表的樹,將其右子樹賦給臨時變數,設root.right root.left,並將左子樹置空,然後將臨時變數賦給root.right。pub...
二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6 將其展開為 1 2 3 4 5 6解法1 前序遍歷,1.先儲存舊的右子樹,2.把左子樹賦值給root.right,把左子樹置為nil 3.遍歷找到最右邊的節點,把舊的右子樹接到最右邊的葉子節點上 4.根節點處理完成,向下遞...
LeetCode二叉樹展開為列表
題目描述 給定乙個二叉樹,原地將它展開為乙個單鏈表。例如,給定二叉樹 1 2 5 3 4 6 將其展開為 1 2 3 4 5 6想法 總體 將所有含左子樹的結點的左子樹都移動到該結點的右指標上,原本的右子樹移動到原左子樹最右結點 這點要記得注意,一定是移動到最右結點,不然不是順序結構 實現 利用遞迴...