请实现两棵树是否相等的比较,相等返回1,否则返回其他值,并说明算法复杂度。 数据结构为: typedef struct_TreeNode{ char c; TreeNode *leftchild; TreeNode *rightchild; }TreeNode; 函数接口为:int CompTree(TreeNode* tree1,TreeNode* tree2); 注:A、B两棵树相等当且仅当Root->c==RootB-->c,而且A和B的左右子树相等或者左右互换相等。
如果是单纯比较树则这个问题比较简单,这个地方有一个左右互换相等,需要特别处理一下:
如下图,就是相同的树,左右互换相等。
仔细分析一下,如果用递归算法,可以很简单的得到一个解:
对于2个孩子的节点,A与B是否相等等同于
compare(A.left, B.left) && compare(A.right, B.right) || compare(A.left, B.right) && compare(A.right, B.left)
而对于一个孩子的节点和叶子节点需要特殊处理,用JAVA实现之就是:
如果说递归不好,想用其他方法,自然想到深度遍历的栈,简单来讲,可以用2个栈来实现,A栈放A树,B栈放B树,有点特殊的就是:
1.如果节点有1个孩子,则可能要进行左右交换,如上图中的b节点。
2.如果节点有2个孩子,也可能要进行左右交换,如上图中的b和c节点。
交换的结果就是入栈时候放入不同元素。
用Java实现就是:
这里用到了2个栈,其实可以看到,AB两个栈要么同时出,要么同时进,可以简化为一个栈。
3种算法的时间复杂度是O(N),因为树元素都只访问一次。