• 5677: 数据结构实验:二叉树线索化


    二叉树遍历时,需要多次的压栈和出栈过程,效率比较低。对二叉树进行线索化可以有效解决此问题。

    每一棵二叉树上,很多结点都含有未使用的指向NULL的指针域。二叉树线索化时:

    如果结点有左子树,则 left 指针域指向左孩子,否则 left 指针域指向该结点的直接前趋;

    如果结点有右子树,则 right 指针域指向右孩子,否则 right 指针域指向该结点的直接后继。

    为了避免指针域指向的结点的意义混淆,需要改变结点本身的结构,增加两个标志域,最终结构如下:

    typedef struct BNode

    {

    int data;

    struct BNode* left, *right;

    int lTag, rTag;//0表示有孩子,1表示无孩子

    }BNode;

    后台已经完成了二叉树的创建,以及对线索化后的二叉树进行中序遍历。你需要补充完成二叉树中序线索化函数:

    void InThreading(BNode* p);//主函数会调用此函数并将p指向根节点

    输入

    单组数据,占一行,代表一棵二叉树。结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替)。

    输出

    输出中序遍历二叉树得到的序列,每个结点之前空一格。

    样例输入

    样例输出

     

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 typedef struct BNode
     6 {
     7 int data;
     8 struct BNode* left, *right;
     9 int lTag, rTag;//0表示有孩子,1表示无孩子
    10 }BNode;
    11 
    12 struct BNode *pre;  //全局变量pre为空
    13 
    14 
    15 void InThreading(struct BNode* p)
    16 {
    17     if(p){
    18         InThreading(p->left);
    19         if(p->left==NULL){
    20             p->lTag=1;
    21             p->left=pre;
    22         }
    23         if(pre&&pre->right==NULL){
    24             pre->rTag=1;
    25             pre->right=p;
    26         }
    27         pre=p;
    28         InThreading(p->right);
    29     }
    30 }
    31 
    32 BNode* Creattree()
    33 {
    34     struct BNode *A[105];
    35     struct BNode *u,*root;
    36     root=(struct BNode*)malloc(sizeof(struct BNode));
    37     int num,jishu=0,flag=0;
    38     while(scanf("%d",&num)&&num!=-1)
    39     {
    40         if(flag==0){
    41             if(num==0){
    42                 root=NULL;
    43             }
    44             else{
    45                 root->data=num;
    46                 root->left=NULL;
    47                 root->right=NULL;
    48                 root->lTag=0;
    49                 root->rTag=0;
    50             }
    51             A[++jishu]=root;
    52             flag=1;
    53         }
    54         else{
    55             u=(struct BNode*)malloc(sizeof(struct BNode));
    56             if(num==0){
    57                 u=NULL;
    58             }
    59             else{
    60                 u->data=num;
    61                 u->left=NULL;
    62                 u->right=NULL;
    63                 u->lTag=0;
    64                 u->rTag=0;
    65             }
    66             A[++jishu]=u;
    67             if(jishu%2==0){
    68                 A[jishu/2]->left=u;
    69             }
    70             else{
    71                 A[jishu/2]->right=u;
    72             }
    73         }
    74     }
    75     return root;
    76 }
    77 void InOrderThread(BNode* p)
    78 {
    79     while(p){
    80         while(p->lTag==0){
    81             p=p->left;
    82         }
    83         printf(" %d",p->data);
    84         while(p->rTag==1&&p->right!=NULL){
    85             p=p->right;
    86             printf(" %d",p->data);
    87         }
    88         p=p->right;
    89     }
    90 }
    91 int main()
    92 {
    93     BNode *head;
    94     head=Creattree();
    95     InThreading(head);
    96     InOrderThread(head);
    97 }
    View Code
  • 相关阅读:
    设计改进ls代码实现更多功能
    20181328 《网络攻防》 EXP5 信息收集与漏洞扫描
    Socket 实验代码
    冲刺第一天——安装熟悉所使用的软件及其环境配置
    20181328 《网络对抗技术》Exp3 免杀原理与实践
    20181328 网络攻防实验一 PC平台逆向破解
    20181328 网络攻防实验一 PC平台逆向破解(最终版)
    20181328祝维卿——Exp2后门原理与实践
    设计实现ls功能
    Sql 2008 : 数据库分文件组(指定磁盘), 映射分区表使用不同的文件组详解(阻止保存要求重新创建表的更改?)
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/10792737.html
Copyright © 2020-2023  润新知