\[ \lceil \log_{2}{(n+1)} \rceil \]
或
\[ \lfloor \log_{2}{n} \rfloor +1 \]
拉链法也有缺点:指针需要额外的空间,故当元素规模较小时开放定址法较为节省空间,若将节省的指针空间用来扩大哈希表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高了平均查找速度。
刚开始一直想着怎么从u和v往上找,u和v又只有孩子指针,没法往上找。后来从二叉搜索树的性质入手,解决了问题。
对于某一个结点p,如果u->key < p->key 并且 v->key > p->key,则这个结点即为最近公共祖先。如果u和v都在p的左子树或右子树,则继续往相对应的左子树或右子树查找,直到符合u->key < p->key 并且 v->key > p->key为止。
int Find(Tree T,int x)
{
if (!T) return 0;
if (T->Key == x)
{
return 1;
}
if (x > T->Key)
{
return Find(T->Right, x);
}
if (x < T->Key)
{
return Find(T->Left, x);
}
}
int LCA( Tree T, int u, int v )
{
if (!T)
{
return ERROR;
}
if (!Find(T, u) || !Find(T, v))
{
return ERROR;
}else if (u == v)
{
return u;
}
if (u > T->Key && v > T->Key)
{
return LCA(T->Right, u, v);
}
if (u < T->Key && v < T->Key)
{
return LCA(T->Left, u, v);
}
if ( (u > T->Key && v < T->Key) || (u < T->Key && v > T->Key) )
{
return T->Key;
}
}
原文:https://www.cnblogs.com/wzt392217419/p/12772084.html