C++ 堆栈模板在实现二叉树时有一些逻辑错误

C++ 堆栈模板在实现二叉树时有一些逻辑错误,c++,data-structures,tree,stack,C++,Data Structures,Tree,Stack,我有一个堆栈模板和一个TreeNode(二叉树)模板。下面是两个类(stack和TreeNode)的代码。我使用insert()函数成功地将数据插入到树中,但使用堆栈检索数据时出现问题。以下是编译时错误: 错误1错误C2143:语法错误:缺少“;”在“*”之前c:\users\computer house\desktop\tree 1\tree 1\source.cpp 8 1 tree 1 #include<iostream> #include<stdlib.h> us

我有一个堆栈模板和一个TreeNode(二叉树)模板。下面是两个类(stack和TreeNode)的代码。我使用insert()函数成功地将数据插入到树中,但使用堆栈检索数据时出现问题。以下是编译时错误:

错误1错误C2143:语法错误:缺少“;”在“*”之前c:\users\computer house\desktop\tree 1\tree 1\source.cpp 8 1 tree 1

#include<iostream>
#include<stdlib.h>
using namespace std;

template<class T>
class Stack{
private:
    TreeNode<T> *headNode, *pastCurrentNode;

public:
    Stack(){
        headNode = new TreeNode<T>;
        headNode=NULL;
    }

    void push(T x){
        TreeNode<T>* newNode = new TreeNode<T>;
        newNode->set(x);

        if(headNode != NULL){
            newNode->setNext(headNode);
            pastCurrentNode=headNode;
            headNode=newNode;
        }
        else{
            headNode=newNode;
            pastCurrentNode=headNode;
        }
    }

    T pop(){
        TreeNode<T>* p = new TreeNode<T>;
        p = headNode;
        headNode = pastCurrentNode;
        T x = p->get();
        delete p;
        return x;
    }

    T top(){return headNode->get();}

    bool isEmpty(){return (headNode == NULL);}
};

template<class T>
class TreeNode{
private:
    TreeNode* right, *left;
    T* object;


public:
    TreeNode(){
        this->left = this->right = NULL;
        object = NULL;
    }

    TreeNode(T* object){
        this->object  = object;
        this->left = this->right = NULL;
    }

    T* getInfo(){
        return this->object;
    }

    void setInfo(T* object){
        this->object = object;
    }

    TreeNode* getLeft(){return this->left;}
    void setLeft(TreeNode* left){this->left = left;}
    TreeNode* getRight(){return this->right;}
    void setRight(TreeNode* right){this->right = right;}

    int isLeaf(){
        if(this->left==NULL && this->right == NULL){
            return 1;
        }
        return 0;
    }

};


void insert(TreeNode<int>* root, int* info){
    TreeNode<int>* newNode = new TreeNode<int>(info);
    TreeNode<int>*p, *q;

    p = q = root;

    while(*info != *p->getInfo() && q != NULL)
    {
        p = q;

        if(*info < *p->getInfo())
            q = p->getLeft();
        else 
            q = p->getRight();

    }

    if(*info == *p->getInfo()){
        cout<<"Error: Duplication: "<<*info<<endl;
        delete newNode;
    }
    else if(*info < *p->getInfo()){
        p->setLeft(newNode);
    }
    else{
        p->setRight(newNode);
    }
}



void sInOrder(TreeNode<int>* root){
    Stack< TreeNode<int>* > stack;
    TreeNode<int>* p;

    p=root;

    do{
        while(p != NULL){
            stack.push(p);
            p = p->getLeft();
        }
        //At this point left tree is empty

        if(! stack.isEmpty()){
            p = stack.pop();
            cout<<*p->getInfo()<<" ";
            //go back and traverse right subtree
            p = p->getRight();
        }
    }
    while(!stack.isEmpty() || p!=NULL);

}

int main(){

    int x[]={14,15,4,9,7,18,3,5,16,4,20,17,9,14,5,-1};
    TreeNode<int>* root = new TreeNode<int>;

    root->setInfo(&x[0]);

    for(int i=1; x[i]>0; i++){
        insert(root, &x[i]);
    }

    cout<<"\nStacked In Order: "; sInOrder(root);
    cout<<endl;


    system("pause");
}
错误2错误C4430:缺少类型说明符-假定为int。注:C++不支持缺省INTC\\用户\计算机房子\桌面\树1 \树1 \SooRe.CPP 8 1树1 < /强> < /P>
#include<iostream>
#include<stdlib.h>
using namespace std;

template<class T>
class Stack{
private:
    TreeNode<T> *headNode, *pastCurrentNode;

public:
    Stack(){
        headNode = new TreeNode<T>;
        headNode=NULL;
    }

    void push(T x){
        TreeNode<T>* newNode = new TreeNode<T>;
        newNode->set(x);

        if(headNode != NULL){
            newNode->setNext(headNode);
            pastCurrentNode=headNode;
            headNode=newNode;
        }
        else{
            headNode=newNode;
            pastCurrentNode=headNode;
        }
    }

    T pop(){
        TreeNode<T>* p = new TreeNode<T>;
        p = headNode;
        headNode = pastCurrentNode;
        T x = p->get();
        delete p;
        return x;
    }

    T top(){return headNode->get();}

    bool isEmpty(){return (headNode == NULL);}
};

template<class T>
class TreeNode{
private:
    TreeNode* right, *left;
    T* object;


public:
    TreeNode(){
        this->left = this->right = NULL;
        object = NULL;
    }

    TreeNode(T* object){
        this->object  = object;
        this->left = this->right = NULL;
    }

    T* getInfo(){
        return this->object;
    }

    void setInfo(T* object){
        this->object = object;
    }

    TreeNode* getLeft(){return this->left;}
    void setLeft(TreeNode* left){this->left = left;}
    TreeNode* getRight(){return this->right;}
    void setRight(TreeNode* right){this->right = right;}

    int isLeaf(){
        if(this->left==NULL && this->right == NULL){
            return 1;
        }
        return 0;
    }

};


void insert(TreeNode<int>* root, int* info){
    TreeNode<int>* newNode = new TreeNode<int>(info);
    TreeNode<int>*p, *q;

    p = q = root;

    while(*info != *p->getInfo() && q != NULL)
    {
        p = q;

        if(*info < *p->getInfo())
            q = p->getLeft();
        else 
            q = p->getRight();

    }

    if(*info == *p->getInfo()){
        cout<<"Error: Duplication: "<<*info<<endl;
        delete newNode;
    }
    else if(*info < *p->getInfo()){
        p->setLeft(newNode);
    }
    else{
        p->setRight(newNode);
    }
}



void sInOrder(TreeNode<int>* root){
    Stack< TreeNode<int>* > stack;
    TreeNode<int>* p;

    p=root;

    do{
        while(p != NULL){
            stack.push(p);
            p = p->getLeft();
        }
        //At this point left tree is empty

        if(! stack.isEmpty()){
            p = stack.pop();
            cout<<*p->getInfo()<<" ";
            //go back and traverse right subtree
            p = p->getRight();
        }
    }
    while(!stack.isEmpty() || p!=NULL);

}

int main(){

    int x[]={14,15,4,9,7,18,3,5,16,4,20,17,9,14,5,-1};
    TreeNode<int>* root = new TreeNode<int>;

    root->setInfo(&x[0]);

    for(int i=1; x[i]>0; i++){
        insert(root, &x[i]);
    }

    cout<<"\nStacked In Order: "; sInOrder(root);
    cout<<endl;


    system("pause");
}
#包括
#包括
使用名称空间std;
模板
类堆栈{
私人:
TreeNode*headNode,*pastCurrentNode;
公众:
堆栈(){
头节点=新的树节点;
headNode=NULL;
}
无效推力(T x){
TreeNode*newNode=新的TreeNode;
新建节点->设置(x);
if(头节点!=NULL){
新建节点->设置下一步(头节点);
pastCurrentNode=头节点;
headNode=newNode;
}
否则{
headNode=newNode;
pastCurrentNode=头节点;
}
}
T pop(){
TreeNode*p=新的TreeNode;
p=头节点;
headNode=pastCurrentNode;
T x=p->get();
删除p;
返回x;
}
T top(){return headNode->get();}
bool isEmpty(){return(headNode==NULL);}
};
模板
三烯类{
私人:
树节点*右,*左;
T*对象;
公众:
TreeNode(){
此->左=此->右=空;
object=NULL;
}
树节点(T*对象){
这个->对象=对象;
此->左=此->右=空;
}
T*getInfo(){
返回此->对象;
}
void setInfo(T*对象){
这个->对象=对象;
}
TreeNode*getLeft(){返回此->左;}
void setLeft(TreeNode*left){this->left=left;}
TreeNode*getRight(){返回此->右;}
void setRight(TreeNode*right){this->right=right;}
int isLeaf(){
if(this->left==NULL&&this->right==NULL){
返回1;
}
返回0;
}
};
空插入(TreeNode*根,int*信息){
TreeNode*newNode=新的TreeNode(信息);
TreeNode*p,*q;
p=q=根;
而(*info!=*p->getInfo()&&q!=NULL)
{
p=q;
如果(*info<*p->getInfo())
q=p->getLeft();
其他的
q=p->getRight();
}
如果(*info==*p->getInfo()){
您是否有:

TreeNode<T> *headNode, *pastCurrentNode;
将满足
headNode
pastCurrentNode
的声明。但是,它不满足

Stack(){
    headNode = new TreeNode<T>;
    headNode=NULL;  // This is a problem anyway.
                    // You have just leaked memory.
}
PS我注意到您正在使用

    TreeNode<T>* newNode = new TreeNode<T>;
    newNode->set(x);
TreeNode*newNode=newtreenode;
新建节点->设置(x);

Stack::push
中。但是,
TreeNode
中没有
set
功能。您需要适当地更新代码才能正常工作。

先生,我无法理解该解决方案。请您提供已解决代码的详细信息
// Define TreeNode first.

template<class T>
class TreeNode{
private:
    TreeNode* right, *left;
    T* object;


public:
    TreeNode(){
        this->left = this->right = NULL;
        object = NULL;
    }

    // Add rest of TreeNode definition
};

// Now define Stack.

template<class T>
class Stack{
private:
    TreeNode<T> *headNode, *pastCurrentNode;

public:
    Stack(){
        headNode = new TreeNode<T>;
        headNode=NULL;
    }

    // Add rest of Stack definition

};
    TreeNode<T>* newNode = new TreeNode<T>;
    newNode->set(x);