LeetCode 114 二叉樹展開為鍊錶

2022-09-01 00:57:10 字數 1400 閱讀 6568

原題(medium):

給定乙個二叉樹,原地將它展開為鍊錶。

根據題意,原地展開的意思是,按照中序遍歷的順序(中左右)把二叉樹的結點逐一放到樹的右節點上。

思路:

我們已經知道,展開為鍊錶後各節點順序就是二叉樹中序遍歷的順序,那麼於乙個節點而言,展開後,原本在其左子樹節點肯定在原本其右子樹的前面,例如:

其展開後節點2肯定在結點3前面。結果為:

那麼,用左節點取代右節點的位置,這於根結點而言,應該是沒錯的,是合乎順序的,但是在這之前,我們肯定要考慮右節點的去向,我們可以以題目的例子為例:

我們用左子樹取代右子樹,右子樹暫時孤立,即:

那麼按照中序遍歷的順序(節點內的數字就代表中序遍歷的順序),這右子樹應該落在**呢?顯然,應該節點4的右節點上:

而於根結點1而言,節點4是乙個什麼節點呢?我們能否根據特徵找到這個節點然後把右子樹接上去呢?其實我們要找的就是根節點的左子樹的最右節點(節點4就是最右節點),按照中序遍歷的順序,這個最右節點就是在遍歷到根節點之前的最後乙個節點(就是說遍歷完該節點後下乙個被遍歷的節點就是根節點),那麼把右子樹接到該最右節點的右子樹上,就非常合理了。至於怎麼找到它也非常容易,因為我們已經知道它是左子樹的最右節點了。從左子樹的第乙個節點開始一直往其右節點遍歷,直到右節點為空。

再經歷了上述的變換後,我們還沒有解決問題,可以看到,雖然節點1的下的所有節點已經移動到右子樹,但右子樹里仍有不合題意的節點,顯然需要我們進入右子節點,以節點2為根節點,繼續考慮其左右子樹的情況,進行類似的變換。可以得知,這是遞迴的思路,但實現的方法可以是遞迴,也可以不是遞迴。

1

void flatten(treenode*root)

10 root = root->right; //

繼續下乙個節點11}

leetcode114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。先把左右展開,右放左最後,左放右,左置空 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none clas...

Leetcode 114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6 複製 將其展開為 1 2 3 4 5 6 複製 這算是比較經典的一道題目了,博主面試快手的時候原題。最開始一想,覺得遞迴的求解不就好了,但是遞迴的時候發現需要注意乙個地方就是 需要先遞迴右子樹,然後記錄下右子樹展開完成之後...

leetcode 114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6採用二叉樹後序遍歷 python 如下 class treenode object def init self,x self.val x self.left none self.right ...