請實現兩個函式,分別用來序列化和反序列化二叉樹
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。
序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個 字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,==重構二叉樹
==。1.前序遍歷(中序後序基本相同)
/*
struct treenode
};*/
class
solution
};
2.層次遍歷(參考jz59,jz60使用佇列)
char
*serialize
(treenode *root)
// process not null node
s +=to_string
(node-
>val)
; s.
push_back
(',');
// push operator
qt.push
(node-
>left)
; qt.
push
(node-
>right);}
char
*ret =
newchar
[s.length()
+1];
strcpy
(ret, s.
c_str()
);return ret;
}
1.前序遍歷
// 引數使用引用&, 以實現全域性變數的目的
treenode*
deseri
(char
*&s)
// 構造根節點值
int num =0;
//這裡用while而不用if是因為,雖然這一步操作是為了將此時根節點的字串數字轉化為int,但是可能是不知一位數字,如:53,128等。
while
(*s !=
',')
++s;
// 遞迴構造樹
treenode *root =
newtreenode
(num)
; root-
>left =
deseri
(s);
root-
>right =
deseri
(s);
return root;
}treenode*
deserialize
(char
*str)
2.層次遍歷
treenode*
deserialize
(char
*str)
// 可用string成員函式
string s
(str);if
(str[0]
=='#'
)// 構造頭結點
queue> nodes;
treenode *ret =
newtreenode
(atoi
(s.c_str()
)); s = s.
substr
(s.find_first_of
(',')+
1); nodes.
push
(ret)
;// 根據序列化字串再層次遍歷一遍,來構造樹
while
(!nodes.
empty()
&&!s.
empty()
)else
if(s[0]
=='#'
)else
}return ret;
}
JZ61 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹,不對序列化之後的字串進行約束,但要求能夠根據序列化之後的字串重新構造出一棵與原二叉樹相同的樹。輸入 返回值 基於先序遍歷,把所有結點的 val 儲存到字串中 用空格間隔開每個結點得到 val 對於子結點為空的,用 標識也儲存到字串中,這就是序列化的過程...
61 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 思路一 選用vectorarr作為輔助,最後轉為int 和char 的資料型別,由於 不方便表示,因此用乙個不會出現的數0x23333代替。方法上是使用遞迴的先序遍歷。一 struct treenode class solution treenode ...
61 序列化二叉樹
題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 思路 層次遍歷,非遞迴。其實是二叉樹的層次遍歷,對應於寬度優先搜尋,bfs。二叉樹的序列化,即給定二叉樹的根結點,按照某種遍歷方式將所有結點鏈結為乙個陣列或者字串。反序列化,即根據給定的序列重新恢復一棵二叉樹。例如一棵二叉樹 1 2 3 nu...