在二叉树中搜索特定的叶子节点,记录路由

时间:2019-06-13 15:09:54

标签: c++ huffman-code

我有一棵二叉树,其中叶节点有一个char(“ a”,“ r”等)。我想搜索该树中的特定节点,并在找到它时记录路由。 (这是霍夫曼的算法) 问题是我的代码只打印了最后两个子路由(对于字符“ p”,我的代码只显示了“ 10”,它应该打印“ 110”。 这个词是:。路由从根开始。 enter image description here

我认为问题在于递归。可能是双重递归,因为我在左节点和右节点中找到。

struct nodo{
    int frecuencia;
    nodo *izq, *der, *next;
    char letra;
    int binario; // binario it is "0" or "1" 
    int usado;

};

bool recorrerarbol(nodo *n, char letradada, string &cadena){
    if(n!=NULL){
            if(n->letra==letradada){
                    cadena=to_string(n->binario)+cadena; //n->binario it is 0 or 1
                    return true;
            }
            else{
                    if(recorrerarbol(n->izq,letradada,cadena)){
                            cadena=to_string(n->binario)+cadena;
                    }
                    else{
                            if(recorrerarbol(n->der,letradada,cadena)){
                                   cadena=to_string(n->binario)+cadena;
                    }}
            }

    }

    return false;
    }

预期输出为: 代表“ a”:111 对于“ p”:110 对于“ d”:0 我得到的是: “ d”:00 “ p”:10 “ a”:11 如您所见,问题在于它仅考虑了height的最后两个级别。 谢谢

1 个答案:

答案 0 :(得分:0)

我回复自己。问题是每个if / else不返回True。因此,在某些情况下,该函数在有效找到所需节点时会返回false。 这是有效的代码:n指向树的根音的指针,“ letradada”是我们要查找的节点上的字母,cadena带有路径的字符串(例如:01101)

private static $config = [
    'data' => [
        'data' => 'v1',
        'altceva' => 'v2'
    ],
    'sec' => [
        'data' => 'v3',
        'altceva' => 'v4'
    ],
    'thrs' => [
        'data' => 'v5',
        'altceva' => [
            'misc' => 'v6',
            'altceva' => 'v7',
            'super' => 'v8'
        ]
    ]
];

public static function get(){

    // get parameters
    $args = func_get_args();

    // new value
    $newValue = $args[0];

    // specified node
    $node = implode(".", array_values(array_slice($args, 1)));

    // encode config array
    $encoded = self::encodeArray(self::$config);

    // check if specified node exists
    if( ! isset($encoded[$node]) ){
        return false;
    }

    // change node content
    $encoded[$node] = $newValue;

    // do something with the result
    return self::decodeArray($encoded);


}

private static function encodeArray( $arr, $node = null ){

    $result = [];

    foreach( $arr as $thisKey => $val ){

        $currentKey = ($node != null ? $node.'.' : '') . $thisKey;

        if( is_array($val) ){   

            foreach( self::encodeArray($val, $currentKey) as $subKey => $subVal)
                $result[ $subKey ] = $subVal;

        } else {
            $result[ $currentKey ] = $val;
        }

    }


    // return result
    return $result;

}

private static function decodeArray( $arr ){

    $result = [];

    foreach( $arr as $key => $val ){

        $microKey = explode(".", $key);

        if( count($microKey) > 1 ){

            $innerKey = implode(".", array_slice($microKey, 1));

            if( isset($result[$microKey[0]] ) )
                $result[ $microKey[0] ] = array_merge_recursive( $result[ $microKey[0] ], self::decodeArray([$innerKey => $val]));
            else
                $result[ $microKey[0] ] = self::decodeArray([$innerKey => $val]);

        } else {
            $result[ $key ] = $val;
        }

    }

    return $result;

}

/*
* call your method
*/
print_r(YourClass::get('Kogaion', 'thrs', 'altceva', 'altceva'));

谢谢大家