在C ++中搜索树中节点的最快方法

时间:2013-02-22 14:46:23

标签: c++ tree traversal

#ifndef __TREE_H
#define __TREE_H
#include <cstdlib>
#include<string>

// structure of a tree node

struct TreeNode{
        string str;
        TreeNode *parent;
        TreeNode *leftChild;
        TreeNode *nextSibling;

        TreeNode(string str1){
                this->str = str1;
                this->parent = NULL;
                this->leftChild = NULL;
                this->nextSibling = NULL;
        }

};

class Tree{

        TreeNode* root;
        int size;

public:

        Tree();         //constructor

        void insert(string str1);       //insert a node

        string locate(string str1);     //locate a node

        TreeNode *ancestor(string str1, string str2);   //get lowest common ancestor
};


#endif

这是一类通用树(不是二叉树)。实现定位功能的最快方法是什么?我应该首先通过所有的孩子,然后是兄弟姐妹还是什么?

3 个答案:

答案 0 :(得分:1)

如果树是无序的,除了所有节点的强力测试之外没有其他算法,并且在找到元素(如果找到)时会中断。处理树时,递归通常是最简单的方法。伪算法可能类似于:

find(current_node,value):

if current_node.value == value
   return found
else 
   if find(current_node.left,value) == found
      return found
   else if find(current_node.right,value) == found
      return found
   else
      return not_found

当然,在真正实现这一点时,您需要测试空指针,依此类推。在树上没有任何其他约束的情况下,渐近复杂度不能降低。您可能会使用非递归方法或尾递归算法(基于上述)来改善常数因子,但不要期望在那里有很大的改进。

答案 1 :(得分:0)

如果节点是有序的,即子节点小于此节点且兄弟节点大于此节点,则与str进行比较,并根据结果将结果作为结果或搜索子节点或与兄弟姐妹比较

const TreeNode *TreeNode::locate(const string &str1) const
{
    int c = str.compare(str1);
    if (c == 0)
        return this;

    if (c > 0) {
        if (leftChild)
            return leftChild->locate(str1);

        return 0;
    }

    if (nextSibling)
        return nextSibling->locate(str1);

    return 0;
}

并在树中

const TreeNode *Tree::locate(const string &str1) const
{
    return root->locate(str1);
}

答案 2 :(得分:0)

您可以尝试多种树遍历算法,具体取决于您的信息在树节点之间的分布方式。

BFS,DFS,是一些例子。