樹的序列化與反序列化及應用

2021-08-26 12:07:32 字數 1226 閱讀 4379

我們知道,先序和中序或者後序與中序都可以唯一確定一棵樹,但是先序和後序不行。

今有兩個需求:判斷兩棵樹是否元素相等或是否元素對稱。

方法1:先序和中序或者中序和後序可以唯一確定一棵樹,那麼我們把他們遍歷生成的特徵序列對比即可判斷。

判相等:用遞迴函式,引數是兩棵樹的跟節點,兩個節點採取任意一種遍歷方式,以先序為例,return common(root1->left,root2->left)&&common(root1->right,root2->right)。

判定條件:如果乙個指標空乙個不空直接false,否則比對元素值,不相等則false,相等則繼續遞迴。

判對稱【左樹左孩子等於右樹右孩子】:return common(root1->left,root2->right)&&common(root1->right,root2->left)。

另一種處理方式:可以把他們的特徵序列用string存下來再比對,注意需要設定乙個分隔符,而且如果是特徵序列則需要同時判先序+中序或後序+中序。

同時遞迴不用判兩種的原因在於,遞迴的過程本身會帶有乙個時間戳,而當組合成特徵序列後,時間戳的資訊會丟失。

方法2:類似於特徵序列,但是更為強大。

我們用_作為分隔符,用#表示空節點。

該樹的先序序列化為a_b_#_d_#_g_#_#_c_e_#_#_f_#_#_。

解釋一下為什麼需要分隔符_:

如你所見,如果不加分隔符,這兩棵樹明明是不同的兩棵樹,可是先序序列化的結果都是123#4##。

解釋一下為什麼需要#:

如果所見,他們的先序序列化結果都是12_3_4。

結論:分隔符和空節點佔位符都是必要的。

解題:a.判相等,各自生成先序序列化結果再比對即可

b.判對稱,同樣的,只要將第二棵樹遍歷的順序改為先右孩子再左孩子,生成序列後,比對即可。

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

序列化與反序列化

把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 eg stooges array moe larry curly new serialize stooges print r new echo print r unserial...

序列化與反序列化

序列化是將物件處理為位元組流以儲存物件或傳輸到記憶體 資料庫或檔案。其主要目的是儲存物件的狀態,以便可以在需要時重新建立物件。相反的過程稱為反序列化。通過序列化,開發人員可以儲存物件的狀態,並在需要時重新建立該物件,從而提供物件的儲存以及資料交換。通過序列化,開發人員還可以執行類似如下的操作 通過 ...