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

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

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值