Luis Lee 2021-04-06 12:33 采纳率: 53.8%
浏览 138

中序遍历线索化二叉树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是值传递,但是我传进去的是地址为什么还是没有改变?

  • 写回答

3条回答 默认 最新

  • 关注

    中序遍历就是把打印语句放在中间,就是放在左孩子节点递归的后面,右孩子递归的前面

    评论

报告相同问题?

悬赏问题

  • ¥99 利用C/C++语言,使用TCP/IP协议,编一个简易聊天程序
  • ¥15 如何使用python 实现对串口/dev/ttyUSB0进行上锁,使得该串口只能在一个python脚本中使用,其他脚本不能操作这个串口
  • ¥15 晶体塑性有限元——Damask求解
  • ¥15 写出这个有没有人能写一下今天中午就要
  • ¥30 设计一个图形用户界面来控制你机械臂的运动
  • ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
  • ¥15 RPG游戏架构设计和开发方法
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题