劍指offer 序列化二叉樹

2021-09-25 10:29:47 字數 1334 閱讀 3529

題目描述

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

思路: 二叉樹被建立成檔案的過程叫做序列化,而從檔案來重新構造二叉樹的過程叫做反序列化。序列化可以這樣來做,利用先序遍歷二叉樹,當遍歷的節點不為空時,將節點的值變為字串並在後面加上!來表示分割,當對應位置的節點為空時,在字串後面加上#

反序列化就是利用先序遍歷的序列遞迴的將所得的字串構造成二叉樹,在遞迴過程中,函式的引數一定要是char**,這樣才能保證指向字串的指標隨著遞迴的進行而移動

實現:c++

/*

struct treenode

};*/

/*(1)在序列化時,按照先序便利的序列將二叉樹的節點的值變成字串序列,當節點不為空時

將節點的值變成字元後面再跟乙個!表示分割,而對應位置節點為空時則加上#

(2)反序列化時是將乙個序列轉變為對應的二叉樹,按照先序遍歷序列,遞迴使用字串中的

字元來構造二叉樹此時引數的型別一定要是char**型別的,這樣才能在遞迴的過程中指向字

符串的指標會隨著遞迴的進行而移動*/

class solution

string s;

serialize(root,s);

char *res = new char[s.length()+1];

int i;

for(i=0;ival);//將節點的值變為字元,加入str,並加上分割符!

str += s;

str += '!';

serialize(root->left,str);//繼續這樣遞迴構造左子樹和右子樹

serialize(root->right,str);

}treenode* deserialize(char *str)

treenode *res = deserialize(&str);//因為引數是char**型別的,傳引用

return res;

}treenode* deserialize(char **str)//必須是這樣,這樣在遞迴過程中指向字串的指標才會移動

int val = 0;//節點的值

while(**str!='\0'&&**str!='!')

//求出了節點的值

treenode *root = new treenode(val);

if(**str=='\0')

else

root->left = deserialize(str);//遞迴構造二叉樹

root->right = deserialize(str);

return root;

}};

finished!!!

劍指offer 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹。首先得理解題目的意思,序列化就是返回乙個帶有 和逗號的字串。反序列化就是根據帶有 和逗號的字串返回一棵二叉樹。比如對於二叉樹 1 2 3 4 5 6 7來講,序列化的結果是1,2,3,4,7,5,而反序列化的結果則是輸出一棵二叉樹。public cla...

劍指Offer 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 根據前面的面試題重建二叉樹,我們知道可以從前序遍歷和中序遍歷構造出一棵二叉樹。受此啟發,我們可以先把一棵二叉樹序列化成乙個前序遍歷序列和乙個中序序列的結合,然後再反序列化時通過這兩個序列重構出原二叉樹。但是這個思路有兩個缺點。乙個缺點是該方法要求二叉樹...

劍指offer 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 首先這道題目是要有兩個問題,第乙個是把一棵二叉樹按照前序遍歷的方式變成乙個字串。第二個是把乙個字串變成乙個二叉樹。對於第乙個問題來說,我們要對這棵樹進行乙個前序遍歷,按照中左右的方式放入列表中,如果節點為空,則插入 最後.join 來實現列表到字串的轉...