114 二叉樹展開為鍊錶

2021-10-04 21:53:03 字數 1294 閱讀 9669

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

例如,給定二叉樹

1

/ \ 2

5/ \ \34

6

將其展開為:

1

\ 2\3

\4\5

\6

我們發現,如果從最底層的結點開始,都把它的右孩子插入在左孩子的最後乙個結點處,然後再遞迴的調整結果來的這棵樹,則整棵樹滿足題意。為啥?因為最左下的子樹我們都調整好了。也可以認為這是中序遍曆法。(方法一)

好麻煩,看不懂,咋辦?用輔助空間。我們發現展開之後是個先序遍歷序列。我們先先序遍歷一把,按照訪問的先後順序儲存到乙個arraylist中,然後直接在arraylist裡改他們的結點指向即可。(方法二)

方法一提到了中序遍歷,那麼先序遍歷行不行呢?當然可以。理論依據呢?因為先序遍歷是先訪問根結點,再遍歷左子樹和右子樹。如果我們把右子樹直接接在左子樹的該接入的位置(根據中-左-右)來說,應該接在左子樹的最右下結點。我們寫了個函式來找最右下結點。由於操作之後,左子樹為空,所以我們只需要遞迴的生成右子樹即可。自頂向下的方法。(方法三)

既然方法二和方法三都強調了順序。那麼我們可不可以設定乙個全域性的指標來指示上乙個結點呢?當然可以。只需要簡單的先序遍歷,我們就能獲得last指標。然後通過last改變指向即可。等等?斷鏈之後,怎麼儲存原來結點的狀態呢?沒所謂的,我們可以用cache把右孩子給儲存下來,就不用擔心了。(方法四)

class

solution

else

flatten

(root.right)

;// 遞迴的處理右子樹

}private treenode getlast

(treenode root)

return res;

}}

class

solution

}private

void

initdata

(treenode root)

}

class

solution

flatten

(root.right);}

private treenode getpre

(treenode root)

}

class

solution

else

flatten

(cache);}

}

114 二叉樹展開為鍊錶

首先是原地演算法的定義 演算法原地工作的含義是指不需要任何額外的輔助,演算法所需要的輔助空間不隨著問題的規模而變化,是乙個確定的值。通過觀察示例可以知道,我們可以猜想,大方向是前序遍歷。第一種思路 dfs。設定乙個全域性的指標 這種做法有點脫離原地演算法,因為多開闢了乙個指標變數 核心思想是拿到乙個...

114 二叉樹展開為鍊錶

一開始寫的 114 二叉樹展開為鍊錶 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none class solution def flatt...

114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6思路 從題目可以看出來要求先根遍歷。從根節點開始出發,先檢測其左子結點是否存在 1 找到左子結點最後面的右子節點 如果沒有,就是左子節點本身 2 將根節點和其右子節點斷開,把原右子節點連到原...