zoukankan      html  css  js  c++  java
  • 线索化二叉树的相关操作

    #include <iostream>
    
    using namespace std;
    
    typedef struct Tree
    {
        char data;
        int lTag, rTag;
        struct Tree *lchild, *rchild;
    }Tree;
    
    void firstCreateTree(Tree* &T)
    {
        char ch;
        cin >> ch;
        if ('#' == ch)
            T= NULL;
        else
        {
            T = new Tree;
            T->data=ch;
            firstCreateTree(T->lchild);
            firstCreateTree(T->rchild);
        }
    }
    
    Tree* pre;
    
    void InThreading(Tree* &T)
    {//树线索化
        if (T)
        {
            InThreading(T->lchild);
            if (!T->lchild)
            {
                T->lTag = 1;
                T->lchild = pre;
            }
            else
                T->lTag = 0;
            if (!pre->rchild)
            {
                pre->rTag = 1;//这个很关键,补回去前面的rTag
                pre->rchild = T;
            }
            else
                T->rTag = 0;//不是pre,而是T//其实就是全部写为0,有的话就不写0
            pre = T;
            InThreading(T->rchild);
        }
    }
    
    void InOrderThreading(Tree* &T, Tree* &Thrt)
    {//整棵树线索化
        Thrt = new Tree;
    //    Thrt->lchild = T;
        Thrt->rTag = 1;
        Thrt->rchild = Thrt;
        Thrt->lTag = 0;
        if (!T)Thrt->lchild = Thrt;
        else
        {
            Thrt->lchild = T;
            pre = Thrt;
            InThreading(T);
            pre->rchild = Thrt;
            pre->rTag = 1;
            Thrt->rchild = pre;
        }
    }
    
    void InorderTraverse(Tree* T)
    {
        Tree *p = T->lchild;
        for (; p != T;)
        {
            for (; p->lTag == 0;)p = p->lchild;//往下搞到1,也就是没有左孩子
            cout << p->data;                  //输出最左的一个孩子
            for (; p->rTag == 1 && p->rchild != T;)//看右孩子是不是为1,也就是空
            {
                p = p->rchild;            //空的话跟线索回到上一个并输出
                cout << p->data;
            }
            p = p->rchild;             //不空的话就到了右孩子那里,看起来和上面的相同,其实是不一样的
        }
    }
    
    int main()
    {
        Tree *T,*Thrt;
        firstCreateTree(T);
        InOrderThreading(T,Thrt);
    //    cout << Thrt->rTag << endl;曾经不会这个点
        InorderTraverse(Thrt);
    }
  • 相关阅读:
    H3C IS-IS基础配置
    H3C OSPF实验大集合(IPv4)
    H3C OSPF实验大集合(IPv6)
    H3C RIP实验大集合
    H3C IPv4和IPv6负载均衡
    H3C IPv4与ipv6静态路由
    H3C 配置dns及arp
    H3C 配置DHCP服务器
    H3C 多生成树MSTP
    H3C 配置ftp服务器
  • 原文地址:https://www.cnblogs.com/vhyc/p/5502664.html
Copyright © 2011-2022 走看看