題解 二叉樹展開為單鏈表

2021-10-08 19:33:13 字數 1749 閱讀 8219

給定乙個二叉樹,原地將它展開為乙個單鏈表。

例:

輸入:

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想法 總體 將所有含左子樹的結點的左子樹都移動到該結點的右指標上,原本的右子樹移動到原左子樹最右結點 這點要記得注意,一定是移動到最右結點,不然不是順序結構 實現 利用遞迴...