zoukankan      html  css  js  c++  java
  • 线索二叉树创建及删除

    题目描写叙述

    线索二叉树概念
    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;
    }
  • 相关阅读:
    笔记本电脑处理器(CPU)性能排行榜
    SQL Server 2008管理工具出现 远程过程调用失败0x800706be解决方法
    Installshield使用教程
    区间DP--凸多边形三角剖分
    树形DP--codevs 1380 没有上司的舞会
    DP练习 巡逻
    DP练习 最长上升子序列nlogn解法
    线段树 求区间连乘——hdu 3074 Multiply game
    模拟算法+栈 HDU 1022
    并查集--CSUOJ 1601 War
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7402760.html
Copyright © 2011-2022 走看看