我有一棵二叉树,其中叶节点有一个char(“ a”,“ r”等)。我想搜索该树中的特定节点,并在找到它时记录路由。 (这是霍夫曼的算法) 问题是我的代码只打印了最后两个子路由(对于字符“ p”,我的代码只显示了“ 10”,它应该打印“ 110”。 这个词是:桨。路由从根开始。
我认为问题在于递归。可能是双重递归,因为我在左节点和右节点中找到。
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的最后两个级别。 谢谢
答案 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'));
谢谢大家