這是我的班級節點,Traverse
是一種訪問Huffman二叉樹並保存.txt文件字符代碼的方法。 Codes
是我保存代碼的字符串向量。 Temp
是我將字符的代碼保存到代碼中的臨時字符串。這個遍歷二叉樹的遞歸方法在一些遞歸之後崩潰!爲什麼?
我不明白爲什麼Traverse
的第一個版本很好,而第二個在一些遞歸之後崩潰。
typedef class Node *NODE;
class Node {
private:
int Key;
NODE L;
NODE R;
public:
Node() { L = NULL; R = NULL};
Node(int, NODE, NODE);
~Node() { delete L; delete R;};
NODE Left();
NODE Right();
int GetKey();
void SetKey(int);
void Traverse(vector<string>, string)
void Traverse(NODE, vector<string>, string)
};
第一個版本:
void Node::Traverse(vector<string> &Codes, string Temp = "")
{
if (L != NULL)
{
L->Traverse(Codes, Temp + "0");
R->Traverse(Codes, Temp + "1");
}
else
{
Codes[Ch] = Temp;
Temp.clear();
}
}
第二個版本:
void Node::Traverse(NODE p, vector<string> &Codes, string Temp = "")
{
if (p->Left() != NULL)
{
Traverse(p->Left(), Codes, Temp + "0");
Traverse(p->Right(), Codes, Temp + "1");
}
else
{
Codes[p->GetChar()] = Temp;
Temp.clear();
}
}
主營:
int main()
{
// I Create the Huffman tree and save it's root into H_Tree pointer to Node.
// It works great!
H_Tree->Traverse(Codes, Temp);
// It doesn't work!
H_Tree->Traverse(H_Tree, Codes, Temp);
}
我在你的答案信任。 謝謝。
編輯:我已經試圖檢查是否正確的孩子是空的,但它總是無法正常工作。
在你的第二個版本
你有沒有崩潰的callstack?你知道它正在崩潰的確切指令嗎? – tumdum