树同构

lzy18lzy 2009-08-04 01:50:58

有两棵树,一大一小,怎判断能否把大的树,修剪成小的那棵树,也可以叫做同构!!!

求方法,简单快速就最好!!!
...全文
434 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzy18lzy 2009-09-10
继续顶下
回复
lzy18lzy 2009-08-13
[Quote=引用 12 楼 fancymouse 的回复:]
dp[i,j]表示大树以i为根节点的子树修剪以后是否可以匹配小树以j为根节点的子树,以这个状态进行树型dp,每次转移需要做最大匹配,dp[i,j]=true当且仅当最大匹配数等于j的孩子树。复杂度应该4次。如果节点无序的话小树还需要枚举根节点。
[/Quote]

这个DP方法不错;

枚举可以这样剪枝:(枚举大树)

取一个小树最大分枝节点,作为小树根.然后枚举大树节点,

以当前大树的节点根的分枝数>小树当前根节点数&& 以当前大树的节点为根时的树最大深度>=小树当前深度

就可以用当前的大树节点为根,与小树比较
回复
FancyMouse 2009-08-13
说什么hash啦最小表示法啦的看清lz题意。大树可以修剪,i.e.这是子树同构问题不是树同构。光用hash/最小表示乃们想枚举所有子树?
回复
liao05050075 2009-08-13
树的同构判断可以使用Hash
http://hi.baidu.com/clumsydragon/blog/item/8695b203bc7a98713812bb60.html
回复
FancyMouse 2009-08-13
1c1
< dp[i,j]=true当且仅当最大匹配数等于j的孩子树
---
> dp[i,j]=true当且仅当最大匹配数等于j的孩子数
回复
FancyMouse 2009-08-13
dp[i,j]表示大树以i为根节点的子树修剪以后是否可以匹配小树以j为根节点的子树,以这个状态进行树型dp,每次转移需要做最大匹配,dp[i,j]=true当且仅当最大匹配数等于j的孩子树。复杂度应该4次。如果节点无序的话小树还需要枚举根节点。
回复
dl551djs 2009-08-12
回复
lzy18lzy 2009-08-11
顶下
回复
楼主下面解释了一下什么叫同构。

我的意思是有没有可能有一些数学上的统计数字,或一个简单的式子
比如对于某个节点,到其它节点距离,刚好和子树的距离刚好一一相等,则相等(很可能不正确噢)
能够代表同构,而不需要去全局搜。

[Quote=引用 5 楼 superspring 的回复:]
引用 4 楼 vshuang 的回复:
这种方法肯定可以的。
不过,复杂度比较高。而且左子树和右子树还可以换位。

还有更好又更简单的方法么?
帮顶

引用 3 楼 superspring 的回复:
你搞错了吧,同构的话首先两棵树大小应该一样吧,可能你所说的同构跟一般定义不一样。

回归你的问题,要把大树修改成小,必须对两颗树从根开始进行递归,
以二叉树为例,对于每个对应节点,如果

大树有左右子树,小树可以有左右子…
[/Quote]
回复
lzy18lzy 2009-08-07
[Quote=引用 2 楼 ToBeTough 的回复:]
是不俩棵数的接点数目一样且不完全相同就是同构?是的话,就简单拉。
[/Quote]

所谓同构,就是可以通过旋转,得出来的图形,是一模一样...
回复
lzy18lzy 2009-08-07
这是两棵多叉树来的100个节点以内,除了树深度剪枝+树分枝数剪枝,还有什么加速搜索方法
回复
lzy18lzy 2009-08-07
请看这个题目:

http://acm.nuaa.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1295
回复
这种方法肯定可以的。
不过,复杂度比较高。而且左子树和右子树还可以换位。

还有更好又更简单的方法么?
帮顶

[Quote=引用 3 楼 superspring 的回复:]
你搞错了吧,同构的话首先两棵树大小应该一样吧,可能你所说的同构跟一般定义不一样。

回归你的问题,要把大树修改成小,必须对两颗树从根开始进行递归,
以二叉树为例,对于每个对应节点,如果

大树有左右子树,小树可以有左右子树,也可以有右子树,也可以没有子树,
大树有左子树,小树可以有左子树,可以没有子树,
大树有右子树,小树可以有右子树,可以没有子树,
大树没有子树,小树可以不可以有子树

递归进…
[/Quote]
回复
superspring 2009-08-05
[Quote=引用 4 楼 vshuang 的回复:]
这种方法肯定可以的。
不过,复杂度比较高。而且左子树和右子树还可以换位。

还有更好又更简单的方法么?
帮顶

引用 3 楼 superspring 的回复:
你搞错了吧,同构的话首先两棵树大小应该一样吧,可能你所说的同构跟一般定义不一样。

回归你的问题,要把大树修改成小,必须对两颗树从根开始进行递归,
以二叉树为例,对于每个对应节点,如果

大树有左右子树,小树可以有左右子树,也可以有右子树,也可以没有子树,…
[/Quote]

而且左子树和右子树还可以换位。?不明白

这个复杂度不高啊,要做的就是访问小树的所有节点,没办法访问更少了,只能说递归可能不够快
回复
superspring 2009-08-04
你搞错了吧,同构的话首先两棵树大小应该一样吧,可能你所说的同构跟一般定义不一样。

回归你的问题,要把大树修改成小,必须对两颗树从根开始进行递归,
以二叉树为例,对于每个对应节点,如果

大树有左右子树,小树可以有左右子树,也可以有右子树,也可以没有子树,
大树有左子树,小树可以有左子树,可以没有子树,
大树有右子树,小树可以有右子树,可以没有子树,
大树没有子树,小树可以不可以有子树

递归进行判断,只要有一个几点不满足上面条件就返回 false
否则递归下去直到遍历小树的每个点

回复
ToBeTough 2009-08-04
是不俩棵数的接点数目一样且不完全相同就是同构?是的话,就简单拉。
回复
LeonTown 2009-08-04
先mark
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告