线索二叉树:中序线索二叉树的遍历

线索二叉树:中序线索二叉树的遍历

作者: 冯向阳时间限制: 1S章节: DS:树

截止日期: 2022-06-30 23:55:00

问题描述 :

目的:使用C++模板设计中序线索二叉树的抽象数据类型(ADT)。并在此基础上,使用中序线索二叉树ADT的基本操作,设计并实现简单应用的算法设计。

内容:(1)请参照二叉树的ADT模板,设计中序线索二叉树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)

(2)ADT的简单应用:使用该ADT设计并实现若干遍历线索二叉树的算法设计。

应用:要求设计一个算法,对建立的中序线索二叉树进行遍历。

提示:中序遍历线索二叉树,首先找到第一个访问的结点,即最左下结点,然后通过查找后继结点的方法进行遍历。

参考函数原型:

中序线索二叉树的遍历(共有成员函数)

//中序线索二叉树的遍历  

template<class ElemType>

void Thread_BinaryTree<ElemType>::InThreading_Traverse(Thread_BinaryTreeNode<ElemType> *root, bool (*visit)(Thread_BinaryTreeNode<ElemType> *root));

输入说明 :

第一行:表示无孩子或指针为空的特殊分隔符

第二行:二叉树的先序序列(结点元素之间以空格分隔)

输出说明 :

第一行:中序线索二叉树的遍历结果

输入范例 :

#
A B # C D # # E # # F # G # H # #

输出范例 :

B(1,0),D(1,1),C(0,0),E(1,1),A(0,0),F(1,0),G(1,0),H(1,1)


#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int flag=1;
typedef struct BTNode
{
    string data;
    BTNode* lchild;
    BTNode* rchild;
    int ltag=0;
    int rtag=0;
}BTNode,*BIT;

void creat_tree(BIT *T,string sym)
{
   string ch;
   cin>>ch;
   if(ch==sym)
   {
       *T=NULL;
   }
   else
   {
       *T=new BTNode;
       (*T)->data=ch;
       creat_tree(&(*T)->lchild,sym);
       creat_tree(&(*T)->rchild,sym);
   }
}
BIT prenode=new BTNode;
void Inorder(BIT T)
{
    if(T)
    {
      Inorder(T->lchild);
      if(T->lchild==NULL)
      {   T->ltag=1;
          T->lchild=prenode;
      }
      if(prenode!=NULL&&prenode->rchild==NULL)
    {
        prenode->rtag=1;
        prenode->rchild=T;
    }
    prenode=T;
    if(T->rtag==0&&T->rchild==NULL)
    {
        T->rtag=1;
    }
    Inorder(T->rchild);
    }
}
BIT fxia(BIT *T)
{
   BIT next=NULL;
   BIT curnode;
   if((*T)->rtag==1)
   {
       next=(*T)->rchild;
   }
   else if((*T)->rtag==0)
   {
       if((*T)->rchild==NULL)
       {
           next=NULL;
       }
       else if((*T)->rchild!=NULL)
       {
           curnode=(*T)->rchild;
           while(curnode->ltag==0)
           {
               curnode=curnode->lchild;
           }
           next=curnode;
       }
   }
   return next;
}
BIT ftou(BIT T)
{
    BIT curnode=T;
    if(curnode)
    {
        while(curnode->lchild!=NULL)
        {
            curnode=curnode->lchild;
        }
    }
    return curnode;
}
void shuchu(BIT *T)
{
    BIT Q;
    Q=ftou(*T);
    while(Q!=NULL)
    {
        if(flag==0)
        {
            cout<<",";
        }
        flag=0;
        cout<<Q->data<<"(";
        cout<<Q->ltag<<",";
        cout<<Q->rtag<<")";
        Q=fxia(&Q);
    }
}
int main()
{
    prenode=NULL;
    BIT T;
    string sym;
    cin>>sym;
    creat_tree(&T,sym);
    Inorder(T);
    shuchu(&T);
    return 0;
}

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值