在关联数组中查找此数据的最佳算法?

时间:2014-05-04 19:07:31

标签: c algorithm binary-tree associative-array depth-first-search

我现在正在做一个实验室作业,以制作一个Hangman游戏,而且我正在尝试解决这个问题。我有一个关联数组,它只是一个二叉树,每个节点都是一个键/值对,键是一个字符串,值是一个字符串向量。这些功能对我的问题并不重要。我需要知道的是......

我需要返回一个指针,指向包含树中最多元素的向量。我试图通过深度优先搜索来找到一种方法来做到这一点,但我无法确定要比较的内容以及如何跟踪所有内容。

有人可以给我伪代码或者如何做到这一点吗?

编辑:这是我目前的算法。

GENERIC_VECTOR* find_greatest(Node* root, MYSTRING* pattern) {
    if(root != NULL) {
        GENERIC_VECTOR* left = find_greatest(root->left, pattern);
        GENERIC_VECTOR* right = find_greatest(root->right, pattern);
        int sizeL = generic_vector_size(*left);
        int sizeR = generic_vector_size(*right);
        int sizeT = generic_vector_size(root->data->value);
        if(sizeL > sizeR) {
            if(sizeL > sizeT) {
                mystring_destroy(pattern);
                *pattern = mystring_copy(root->left->data->key);
                return left;
            } else {
                mystring_destroy(pattern);
                *pattern = mystring_copy(root->data->key);
                return &(root->data->value);
            }
        } else {
            if(right != NULL) {
                if(sizeR > sizeT) {
                    mystring_destroy(pattern);
                    *pattern = mystring_copy(root->right->data->key);
                    return right;
                } else {
                    mystring_destroy(pattern);
                    *pattern = mystring_copy(root->data->key);
                    return &(root->data->value);
                }
            } else {
                mystring_destroy(pattern);
                *pattern = mystring_copy(root->data->key);
                return &(root->data->value);
            }
        }
    } else return NULL;
}

1 个答案:

答案 0 :(得分:0)

由于您的DS是树,因此您必须使用其中一个树遍历算法(即,按顺序,按订单或后序):

PseudoCode:

global int maxval = -1;
global NODE *max = NULL; // this pointer will contain the result!

getMaxVal(NODE *n){
    if(n!==NULL){
        if( n->val[key].length > maxval ){
            maxval = n->val[key].length;
            max = n; 
        }
            getMaxVal(n->left);
            getMaxVal(n->right); 
    }
}