Algorithm 如何找到最大公共子树
有一棵树,树被定义为Algorithm 如何找到最大公共子树,algorithm,hash,tree,Algorithm,Hash,Tree,有一棵树,树被定义为 public class TreeNode { int val; vector<TreeNode *> children; TreeNode(int x) { val = x; } } 根为3和4的子树是最大公共子树(注意,可能有两个以上的子树是公共子树) 输出最大子树的根 我认为蛮力方法不好,散列怎么样,但我不知道如何散列 树的结构 散列听起来不错。让我们切换到一般树的二叉树表示,其中二叉树的左
public class TreeNode
{
int val;
vector<TreeNode *> children;
TreeNode(int x) { val = x; }
}
根为3和4的子树是最大公共子树(注意,可能有两个以上的子树是公共子树)
输出最大子树的根
我认为蛮力方法不好,散列怎么样,但我不知道如何散列
树的结构 散列听起来不错。让我们切换到一般树的二叉树表示,其中二叉树的左子树是一般树的第一个子树,而二叉树的右子树是一般树的下一个同级树。你的树现在看起来像这样
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
成为从任意长度字符串到固定长度哈希字符串的一个字符串
nil = f("")
cons(a, b) = f(a + b)
表示有根(子)树的一种方法是使用包含左括号和右括号的字符串。这应该足以让你开始。
nil = f("")
cons(a, b) = f(a + b)