首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++二叉树内存不能“read”异常,求大神解救(已注释)

2013-10-27 
C++二叉树内存不能“read”错误,求大神解救(已注释)#includeiostreamusing namespace stdtemplate class

C++二叉树内存不能“read”错误,求大神解救(已注释)
#include<iostream>
using namespace std;
template <class T>          //二叉树节点结构体定义
struct BiNode{
    T data;
    BiNode<T> *lchild,*rchild;
};
template<class T>
class BiTree{               //建立二叉树的类
private:
    void Create(BiNode<T> *&R,T data[],int i);
    void Release(BiNode<T> *R);
public:
    BiNode<T> *root;
    BiTree(){                   //无参构造函数
        root=NULL;
    }
    BiTree(T data[]);

    void PreOrder(BiNode<T> *R);    //树的前序遍历
     ~BiTree();                      //析构函数
};
template<class T>
 BiTree<T>::~BiTree(){              //析构函数
    Release(root);
 }
template<class T>
void BiTree<T>::Create(BiNode<T> *&R,T data[],int i){       //Create函数
    if(data[i-1]!=0){
        R=new BiNode<T>;
        R->data=data[i-1];
        R->lchild=R->rchild=NULL;
        Create(R->lchild,data,2*i);
        Create(R->rchild,data,2*i+1);
    }
}
 template<class T>
void BiTree<T>::Release(BiNode<T> *R){      //Release函数
    if(!R){
        Release(R->lchild);
        Release(R->rchild);
        delete R;
    }
}
template<class T>
BiTree<T>::BiTree(T data[]){        //带参构造函数
    Create(root,data,1);
}
template<class T>
void BiTree<T>::PreOrder(BiNode<T> *R){         //前序遍历函数
    cout<<R->data<<'\t';
    PreOrder(R->lchild);
    PreOrder(R->rchild);
}
int main(){                         //主函数
    int data[]={1,2,3,4,5,6,7};
    BiTree<int> biTree(data);
    biTree.PreOrder(biTree.root);
}

[解决办法]


#include<iostream>
using namespace std;
template <class T>          //二叉树节点结构体定义
struct BiNode{
    T data;
    BiNode<T> *lchild,*rchild;
};

template<class T>
class BiTree{               //建立二叉树的类
private:
    void Create(BiNode<T> *&R,T data[],int i, int len);
    void Release(BiNode<T> *R);
public:
    BiNode<T> *root;
    BiTree(){                   //无参构造函数
        root=NULL;
    }
    BiTree(T data[], int len);

    void PreOrder(BiNode<T> *R);    //树的前序遍历
     ~BiTree();                      //析构函数
};
template<class T>
 BiTree<T>::~BiTree(){              //析构函数
    Release(root);
 }

template<class T>
void BiTree<T>::Create(BiNode<T> *&R, T data[], int i, int len){       //Create函数
    if(i < len && data[i-1]!=0){


        R=new BiNode<T>;
        R->data=data[i-1];
        R->lchild=R->rchild=NULL;
        Create(R->lchild,data,2*i, len);
        Create(R->rchild,data,2*i+1, len);
    }
}

template<class T>
void BiTree<T>::Release(BiNode<T> *R){      //Release函数
    if(!R){
        Release(R->lchild);
        Release(R->rchild);
        delete R;
    }
}
template<class T>
BiTree<T>::BiTree(T data[], int len){        //带参构造函数
    Create(root,data,1, len);
}
template<class T>
void BiTree<T>::PreOrder(BiNode<T> *R){         //前序遍历函数
    cout<<R->data<<'\t';
if(R->lchild) //mark
  PreOrder(R->lchild);
if(R->rchild) //mark
  PreOrder(R->rchild);
}

int main(){                         //主函数
    int data[]={1,2,3,4,5,6,7};
    BiTree<int> biTree(data, 7);
    biTree.PreOrder(biTree.root);
}


[解决办法]
修改了只是可读区间,或者是越界访问!

热点排行