/ *更新* /
insertNode函数没有正常工作,不会让我验证root!= NULL。当程序中断时,它向我显示它正在发生@insertNode(),行:“if(ptr-> left == NULL){//创建新节点@ left。”就在“if(s.length()> 0)”声明之后。
/ *结束更新* /
我需要帮助将节点插入到我的二叉树中。该树应该“像”一个霍夫曼树,根节点不存储任何值。子节点将在其中存储一个字符。
main将创建一个新树,逐行读入莫尔斯电码“a .-”的txt文件,并将每行字符插入树中的相应节点。
实施例。字母'a'=“.-”的代码将把包含'a'的节点置于树位置root-> left-> right。
我的主要问题是将树初始化为非NULL。我将insert函数留空了,因为它的包装器应该将树的根初始化为节点,但它没有初始化它。当我运行main时,它会读取文件,尝试插入,然后检查树是否为空。在每行读取并“插入”之后,tree.empty检查始终返回1.
我怎样才能使这个工作?
main.cpp文件:
#include <iostream>
#include <fstream>
#include <string>
#include "morse_tree.h"
using namespace std;
string encode(string s);
string decode(string s);
int main(void){
char letter, w = '\0';
string code, s;
Morse_Code tree1;
cout << tree1.empty() << endl;
ifstream morseFile("morse_code.txt");
if (morseFile.is_open()){
while (morseFile >> letter >> code){
cout << letter << ": " << code << endl;
tree1.insert(letter, code);
cout << tree1.empty() << endl;
}
morseFile.close();
}
else
cout << "could not open file: " << endl;
cout << "PRINT TREE IN PRE ORDER" << endl;
tree1.printPreOrder();
cout << tree1.empty() << endl;
system("pause");
}
morse_tree.h文件:
#ifndef _MORSE_TREE_H_
#define _MORSE_TREE_H_
#include <iostream>
#include<string>
using namespace std;
class Morse_Code {
private:
struct TreeNode{
char letter;
TreeNode* left;
TreeNode* right;
TreeNode(char c, TreeNode* l, TreeNode* r){
letter = c;
l = NULL;
r = NULL;
}
};
TreeNode* root;
void preOrder(TreeNode* ptr);
void insertNode(TreeNode* p, string s, char c);
public:
Morse_Code();
Morse_Code(char c, string s);
~Morse_Code();
bool empty()const;
void insert(const char c, string s);
void printPreOrder();
};
#endif
morse_tree.cpp文件:
#include <iostream>
#include "morse_tree.h"
#include<string>
using namespace std;
Morse_Code::Morse_Code(){
root = NULL;
}
Morse_Code::~Morse_Code(){
delete root;
}
bool Morse_Code::empty()const{
return (root == NULL);
}
void Morse_Code::insert(char c, string s){
if (root == NULL){
root = new TreeNode('1', NULL, NULL);
}
insertNode(root, s, c);
}
void Morse_Code::insertNode(TreeNode* ptr, string s, char c){
if (root == NULL){
root = new TreeNode('\0', NULL, NULL);
}
if (s == ""){
ptr->letter = c;
return;
}
if (s.length() > 0){
if (ptr->left == NULL){ // create new node @ left
ptr->left = new TreeNode('1', NULL, NULL);
}
if (ptr->right == NULL){ // create new node @ right
ptr->right = new TreeNode('1', NULL, NULL);
}
if (s.at(0) == '.'){
ptr = ptr->left;
}
if (s.at(0) == '-'){
ptr = ptr-> right;
}
}
insertNode(ptr, s.substr(1), c);
}
void Morse_Code::printPreOrder(){
preOrder(root);
}
void Morse_Code::preOrder(TreeNode* ptr){
if (ptr != NULL) {
cout << ptr->letter << " ";
preOrder(ptr->left);
preOrder(ptr->right);
}
}
morse_code.txt文件:
a .-
b -...
c -.-.
d -..
e .
f ..-.
g --.
h ....
i ..
j .---
k -.-
l .-..
m --
n -.
o ---
p .--.
q --.-
r .-.
s ...
t -
u ..-
v ...-
w .--
x -..-
y -.--
z --..
答案 0 :(得分:1)
代码永远不会创建root
的{{1}},而是在每次调用Morse_Code
时创建一个新的树节点。下面编辑的代码可以解决您的问题。
insert