遍历二叉搜索树

时间:2015-07-02 02:15:41

标签: c++ c++11 binary-search-tree

我已经提出了一个基本的二进制搜索树。这是我的节点

 #ifndef NODE_H
    #define NODE_H

    template<typename T> class node{

        template<typename E> friend class bst;

        public:
            node():data(0), left(NULL), right(NULL){}
            node(T data):data(data),left(NULL), right(NULL){}   

        private:
            T data;
            node<T>* left;
            node<T>* right;
    };

#endif

这是我的兄弟。

#ifndef BST_H
#define BST_H

template<typename T> class bst{
    public:
        bst():root(NULL), nodes(0){}
        bst(node<T>* root):root(root), nodes(0){}

        void insert(node<T>* root, const T& data){

            if(root == NULL){
                node<T>* root = new node<T>();
                root->data = data;
                nodes++;
                return;
            }else if(data <= root->data) {
                insert(root->left, data);

            }else if(data >= root->data){
                insert(root->right, data);

            }
        }

        void preorder(node<T>* root){
            if(root == NULL) return;
            std::cout<< root->data<<'\n';

            preorder(root->left);
            preorder(root->right);
        }
    private:
        node<T>* root;
        int nodes;
};
#endif

这是调用函数

int main(){

    node<int>* root = new node<int>(17);
    bst<int>* t = new bst<int>(root);


    t->insert(root,21);
    t->insert(root,12);
    t->insert(root, 9);

    t->preorder(root);

    delete t;
}

输出只是17,这是根。我觉得我的插入方法无法正常工作,因为预订是一个非常标准的实现。有人可以帮我解决这里出了什么问题。

3 个答案:

答案 0 :(得分:2)

在插入内部不创建局部变量,只需使用一个passe。而不是

node<T>* root = new node<T>();

只做

root = new node<T>();

并通过引用传递root。我会用typedef

来做
typedef node<T>* nodePtr;
void insert(nodePtr &root, const T& data){

但你也可以在没有

的情况下完成

答案 1 :(得分:1)

你必须通过引用传递root,并且不要创建一个遮蔽它的局部变量:

// ...
void insert(node<T>*& root, const T& data){ // passed by reference

            if(root == NULL){
                root = new node<T>();       // reference overwritten
//...

这给了我

17
12
9
21

作为输出,正如预期的那样我猜。

答案 2 :(得分:1)

我看到两个问题。

首先,您要将root声明为insert()方法中的局部变量。此名称与数据成员根重叠。

第二个是,正如您设计的那样,根不会更新。

此代码应该有效:

void insert(node<T>*& root, // <-- root as reference for updating
            const T& data){

        if(root == NULL){
            root = new node<T>(); // <-- here you update root
            root->data = data;
            nodes++;
            return;
        }else if(data <= root->data) {
            insert(root->left, data);

        }else if(data >= root->data){
            insert(root->right, data);

        }
    }

当然,您可以重构,从而获得更简洁和优雅的实现。但这应该产生你期望的结果