求解一道二叉树的算法题

hcfilippo 2010-11-03 11:11:46
题目如下:
给出一个森林(n棵二叉树),其中这些二叉树的左右子树可以随便互换
再给出一棵二叉树,求能否在森林里面找到和该二叉树相同的二叉树
高手请说说具体的解决思路

补充:问题是求森林里的二叉树能否通过一系列变换而达到和目标二叉树相同
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hcfilippo 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 michael122 的回复:]
这就是dp的精髓了,分析的时候自顶向下,实现的时候自下向上
当然也可以用备忘录


引用 2 楼 hcfilippo 的回复:

引用 1 楼 michael122 的回复:
就是比较两颗二叉树是否相同的问题吧
用递归:
左子树=左子树,右子树=右子树

左子树=右子树,右子树=左子树

这样判断的话最坏情况的复杂度是指数级的
[/Quote]
好吧。。。感謝你
michael122 2010-11-03
  • 打赏
  • 举报
回复
这就是dp的精髓了,分析的时候自顶向下,实现的时候自下向上
当然也可以用备忘录

[Quote=引用 2 楼 hcfilippo 的回复:]

引用 1 楼 michael122 的回复:
就是比较两颗二叉树是否相同的问题吧
用递归:
左子树=左子树,右子树=右子树

左子树=右子树,右子树=左子树

这样判断的话最坏情况的复杂度是指数级的
[/Quote]
hcfilippo 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fancymouse 的回复:]
dp[i][j]表示第一棵树以i为根的和第二棵树以j为根的同构。所以平方肯定能搞定。

线性嘛……俺不会
[/Quote]
嗯,dp是好方法,看看我的理解有没有错
设i1,i2是i的左右儿子,j1,j2是j的左右儿子
递推公式:dp[i][j] = dp[i1][j1] && dp[i2][j2] || dp[i1][j2] && dp[i2][j1]
预处理算出以i为根的子树节点数count[i],排序一下
初始化:count[i] == 1的节点两两同构
实际操作中不用算出所有的i,j组合,因为要满足count[i] == count[j]才有可能同构
复杂度为:(n/2)^2 + (n/4)^2 + …… + 1 = (n^2)/3
FancyMouse 2010-11-03
  • 打赏
  • 举报
回复
dp[i][j]表示第一棵树以i为根的和第二棵树以j为根的同构。所以平方肯定能搞定。

线性嘛……俺不会
hcfilippo 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 michael122 的回复:]
就是比较两颗二叉树是否相同的问题吧
用递归:
左子树=左子树,右子树=右子树

左子树=右子树,右子树=左子树
[/Quote]
这样判断的话最坏情况的复杂度是指数级的
michael122 2010-11-03
  • 打赏
  • 举报
回复
就是比较两颗二叉树是否相同的问题吧
用递归:
左子树=左子树,右子树=右子树

左子树=右子树,右子树=左子树

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧