如何检查我的二叉树是否包含重复项? 你有算法吗? 请写下伪码
编辑:或(更好)使用数学属性。 这是我的树上的字母A :( a,U,V)其中A和U中的\分别是左子项和右子项。
如果使用排序关系&lt;二进制搜索树对树进行排序。 (riflessive,antisymmetric,transitive,total)我可以表达T =(a,U,V)是有序的,没有重复IFONLY \forall u \in flatten(U) and \forall v \in flatten(V). u < a< v and u \neq a and a \neq v
,我要以递归方式检查树U和树树V的属性。但问题是:如果树没有排序(或者不是二叉搜索树),我如何检查树不包含重复项?
为我的第一个不明确的问题道歉
EDIT2: flatten是返回参数树元素集的函数
答案 0 :(得分:3)
有一种显而易见的O(n log n)方法,您可以收集元素,对列表进行排序并查找重复项。问题至少与在数组中查找重复项一样困难,请参阅this。因此,如果仅依靠比较,则无法实现比O(n log n)更好的效果。
答案 1 :(得分:1)
如果输入有限,例如,在值1到1000之间,则可以使用数组,我们称之为A
。
使用值val
遍历每个节点并让A[val]=1
这样就可以标记出遇到的所有元素
这个版本在O(n)
中运行,并使用其他1000
个空格元素。