我们知道,先序和中序或者后序与中序都可以唯一确定一棵树,但是先序和后序不行。
今有两个需求:判断两棵树是否元素相等或是否元素对称。
方法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.判对称,同样的,只要将第二棵树遍历的顺序改为先右孩子再左孩子,生成序列后,比对即可。