判断两棵树是否相等

请实现两棵树是否相等的比较,相等返回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),因为树元素都只访问一次。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值