中序遍历线索化二叉树c++递归实现

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