假设我有一个像这样的树实现(简化):
class Node
{
public:
std::string name;
int attr_1;
double attr_2;
unsigned int nChildren;
Node* Children;
}
如果我需要通过其属性或名称获取特定节点,我是否需要从根遍历每个子节点才能找到它?或者是否有更快的搜索算法,或更快/更好的树实现?比如说,我需要通过类和id属性找到一个节点,比如当我需要应用CSS规则时。
答案 0 :(得分:1)
如果没有规则定义节点可以/不可以的位置,则必须扫描所有节点,直到找到匹配为止。
算法中没有神奇的猜测。
答案 1 :(得分:1)
在您当前的草稿中,我认为找到具有特定Node
,name
,id
任何其他数据的class
的唯一可能方法是遍历树查看每个节点。时间复杂度为 O(nNodes)。
您可能对二进制搜索树感兴趣,它允许您在 O(log(nNodes))中进行搜索操作,这样更快!但是,在添加/删除节点时,它们需要一些额外的工作才能保持有效。同样重要的是保持树平衡,这是 O(log(nNodes))时间的主要要求。
修改1
我熟悉css语法。在树上实现以满足所有css要求是很复杂的。这里确实二元搜索树不能代表DOM树。 DOM树应该由Node表示,对其子节点的引用以及对其父节点的可能性。二叉搜索树可以存储对这些节点的引用,并且例如通过id
成功地提供搜索查询。但是如果任何节点被删除/添加/ id改变,二进制搜索树应该做出相应的反应。