树的序列化与反序列化及应用

我们知道,先序和中序或者后序与中序都可以唯一确定一棵树,但是先序和后序不行。

今有两个需求:判断两棵树是否元素相等或是否元素对称。

方法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.判对称,同样的,只要将第二棵树遍历的顺序改为先右孩子再左孩子,生成序列后,比对即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章