有一棵树,树被定义为
public class TreeNode
{
int val;
vector<TreeNode *> children;
TreeNode(int x) { val = x; }
}
请找到maxmum公共子树(拥有最多的节点,每个节点的val无关紧要,只是子树的结构是相同的)
前,
1
/ | \
2 3 4
/ / | \ / | \
5 6 7 8 9 10 11
根3和4的子树是maxmum公共子树(注意,可能有两个以上的子树是公共子树),
输出最大子树的根。
我认为蛮力方法不好,哈希怎么样,但我不知道如何哈希 一棵树的结构。
答案 0 :(得分:1)
哈希听起来不错。让我们切换到一般树的二叉树表示,其中二叉树的左子节点是一般树的第一个子节点,二叉树的右子节点是一般树的下一个兄弟节点。你的树现在看起来像这样。
1
/ \
2 3
/ / \
/ / \
/ / \
5 6 4
\ /
7 9
\ \
8 10
\
11
我们可以使用nil
和cons
对此树进行Lisp样式编码。
cons(cons(cons(nil, nil),
nil),
cons(cons(nil,
cons(nil,
cons(nil, nil))),
cons(cons(nil,
cons(nil,
cons(nil, nil))),
nil)))
让H
成为哈希值的集合。如果我们在哈希值上指定哈希值nil : H
和二进制运算符cons : H * H -> H
,那么我们得到哈希函数。这是一种可能性。让f
为pseudorandom function,从任意长度的字符串到固定长度的哈希字符串。
nil = f("")
cons(a, b) = f(a + b)