插入二叉树

时间:2014-11-05 19:54:49

标签: c++ binary-tree

/ *更新* /

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 --..

1 个答案:

答案 0 :(得分:1)

代码永远不会创建root的{​​{1}},而是在每次调用Morse_Code时创建一个新的树节点。下面编辑的代码可以解决您的问题。

insert