劍指Offer對答如流系列 序列化二叉樹

2021-10-02 10:27:15 字數 887 閱讀 3875

請實現兩個函式,分別用來序列化和反序列化二叉樹。

樹的結構定義如下:

public

class

node

}

一般情況下,需要採用前/後序遍歷和中序遍歷才能確定乙個二叉樹,具體的內容我們之前**過 劍指offer對答如流系列 - 重建二叉樹

但是採用這種方式進行序列化和反序列化代價還是比較大的,於是我們要考慮另外的情況了。

如果採用前序遍歷(遍歷特點 根節點 --> 左子樹 --> 右子樹),將空結點(null)輸出為乙個特殊符號(如「$」),特殊符號充當邊界,這個時候就可以確定乙個二叉樹了。

序列化:前序遍歷的過程中,將遇見的空結點序列化為「$」,每個結點間使用逗號分隔開。

反序列化:同樣使用前序遍歷,遇見乙個新數字(或者$)就建立乙個新結點。

string serialize

(node node)

else

return sb.

tostring()

;}// 全域性int變數index(在字串上的移動的索引),以獲得字串中當前的節點值

private

int index =0;

node deserialize

(string str)

int start = index;

while

(str.

charat

(index)

!=',')if

(!str.

substring

(start, index)

.equals

("$"))

else

return node;

}

劍指Offer對答如流系列 醜數

我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...

劍指Offer對答如流系列 剪繩子

給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...

劍指Offer對答如流系列 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...