template <typename T>
class threadnode {
private:
threadnode* lchild;
threadnode* rchild;
int ltag;//如果是左子节点为0,前驱为1
int rtag;//如果是右子节点为0,后继为1
T data=NULL;
public:
bool operator==(threadnode p){
if(this->data==p.getdata()&&this->lchild==p.getleft()&&this->rchild==p.getright()){
return true;
}else{
return false;
}
}
virtual void setdata(T d){data=d;}
virtual T getdata(){return data;}
threadnode* getleft(){return lchild;}
threadnode* getright(){return rchild;}
void setleft(threadnode*l){lchild=l;}
void setright(threadnode*r){rchild=r;}
void setl(int l){ltag=l;}
void setr(int r){rtag=r;}
int getl(){return ltag;}
int getr(){return rtag;}
threadnode(T d=NULL,int lt=0,int rt=0,threadnode<T>* l=NULL,threadnode<T>* r=NULL):ltag(lt),rtag(rt),data(d){}
void InThread(threadnode *pre){
if(this!=nullptr){
lchild->InThread(pre);
if(lchild==nullptr){
lchild=pre;
ltag=1;
}
if(pre!=nullptr&&pre->getright()==nullptr){
(*pre).setright(this);
(*pre).setr(1);
}
pre=this;
rchild->InThread(pre);
}
}
void createinthread(){
int m;
threadnode pre=NULL;
if(this!=nullptr){
InThread(&pre);
pre.setright(nullptr);
pre.setr(1);
m=1;
}
}
};
测试代码:
threadnode<int> o1(1);
threadnode<int> o2(2);
threadnode<int> o3(3);
threadnode<int> o4(4);
o1.setleft(&o2);
o1.setright(&o3);
o2.setright(&o4);
threadnode<int> o5=NULL;
o1.createinthread();
if (o2.getl()==1) {
cout<< o2.getleft()->getdata();
}
测试结果:无法给rchild和rtag赋值,归结原因是pre是值传递,但是我传进去的是地址为什么还是没有改变?
中序遍历就是把打印语句放在中间,就是放在左孩子节点递归的后面,右孩子递归的前面
添加节点应该有条件判断呀,小于根节点的往左边找,大于跟节点的往右边找,没看到你的判断语句呢。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632