• 线索二叉树创建及删除


    题目描写叙述

    线索二叉树概念
    1.定义
     n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这样的附加的指针称为”线索”)。

    这样的加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。依据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
    注意:
     线索链表攻克了二叉链表找左、右孩子困难的问题,出现了无法直接找到该结点在某种遍历序列中的前趋和后继结点的问题。

    2.线索链表的结点结构
     线索链表中的结点结构为:
    这里写图片描写叙述

    当中:
     ltag和rtag是添加的两个标志域,用来区分结点的左、右指针域是指向其左、右孩子的指针,还是指向其前趋或后继的线索。

    以下你的任务:首先依据输入的序列建立二叉树,然后对二叉树进行线索化。最后中序遍历二叉线索树并输出结果。

    输入要求

    输入的第一行包括单独的一个数字T,表示測试序列的数目;
    以下每一行为一个測试序列,測试序列是按先序序列输入字符 ,假设节点没有左或右孩子,则输入用空格表示,最后用一个空格结束一行的输入。

    输出要求

    相应每一个測试序列。採用中序遍历二叉线索树,输出一行
    假如输入

    2
    ABC  DE G  F    
    -+a  *b  -c  d  /e  f   

    应当输出

    CBEGDFA
    a+b*c-d-e/f

    写了个线索二叉树
    Code:

    #include<bits/stdc++.h>
    using namespace std;
    typedef struct BTree
    {
        char data;
        struct BTree *left,*right;
        int ltag,rtag;
    }BTree;
    BTree *CreatBTree()
    {    
        char ch=getchar();
        if(ch==' ')
            return NULL;
        BTree *temp=(BTree *)malloc(sizeof(BTree));
        temp->data=ch;
        temp->ltag=temp->rtag=0;
        temp->left=CreatBTree();
        temp->right=CreatBTree();
        return temp;
    }
    void inThread(BTree *p,BTree *&pre)
    {
        if(p)
        {
            inThread(p->left,pre);
            if(!p->left)
            {
                p->left=pre;
                p->ltag=1;
            }
            if(pre&&!pre->right)
            {
                pre->right=p;
                pre->rtag=1;
            }
            pre=p;
            inThread(p->right,pre);
        }
    }
    void CreateInThread(BTree *T)
    {
        BTree *pre=NULL;
        if(T)
        {
            inThread(T,pre);
            pre->right=NULL;
            pre->rtag=1;
        }
    }
    BTree *first(BTree *p)
    {
        while(p->ltag==0)
            p=p->left;
        return p;
    }
    
    BTree *next(BTree *p)
    {
        if(p->rtag==0)
            return first(p->right);
        else
            return p->right;
    }
    void inOrder(BTree *T)
    {
        for(BTree *p=first(T);p!=NULL;p=next(p))
            cout<<p->data;
    }
    void delBTree(BTree *T)
    {
        BTree *pre=first(T);
        BTree *p=next(pre);
        for(;p!=NULL;pre=p,p=next(p))
            free(pre);
        free(pre);
    }
    int main()
    {    
        int t;
        cin>>t;    
        while(t--)
        {    
            getchar();//吃掉回车    
            BTree *root=CreatBTree();
            getchar();//吃掉最后结尾的空格
            CreateInThread(root);
            inOrder(root);
            cout<<endl;
            delBTree(root);
        }
        return 0;
    }
  • 相关阅读:
    Window 命令
    HTTP 状态码
    Mysql基本用法-存储引擎-04
    Mysql基本用法-存储引擎-03
    Mysql基本用法-left join、right join、 inner join、子查询和join-02
    Mysql基本用法-01
    二进制编码-详细讲解
    JS操作文件
    PHP5接口技术入门
    PHP5中__get()、__set()方法
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7402760.html
Copyright © 2020-2023  润新知