二叉树建立,遍历,搜索,中序线索化

本文详细介绍了二叉树的基本操作,包括如何建立二叉树,如何进行前序、中序和后序遍历,以及如何实现中序线索化的二叉树,以优化中序遍历的过程。通过示例和图解,读者可以深入理解这些概念和技术。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <string.h>
typedef char DataType;
typedef struct node
{
    DataType data;                   // 数据域
    int ltag, rtag;                 //  线索标记
    struct  node *lchild, *rchild;   // 左,右孩子
}BiTnode;
typedef BiTnode * BinTree;


/*
// 创建二叉树  参数接收为数组
void CreateBiTree(BinTree *T,char *&s,int &i)
{
    char ch = s[i];
    if (ch == '#')
    {
        *T = NULL;
    
    }
    else
    {
        *T = (BiTnode *)malloc(sizeof(BiTnode));
        (*T)->data = ch;
      
        i++;
        printf(" 字符%c\n",ch);
        CreateBiTree(&(*T)->lchild,s,i);        //建立左子树
        i++;
        CreateBiTree(&(*T)->rchild,s,i);        //建立右子数  
    }
}
*/

// 创建二叉树  参数接收为数组
void CreateBiTree(BinTree *T, char *&s)
{
    char ch = *s;
    if (ch == '#')
    {
        *T = NULL;

    }
    else
    {
        *T = (BiTnode *)malloc(sizeof(BiTnode));
        //memset(&T, 0, sizeof(BiTnode *));

        (*T)->data = ch;
        s++;
        CreateBiTree(&(*T)->lchild, s);        //建立左子树
        s++;
        CreateBiTree(&(*T)->rchild, s);        //建立右子数  
    }
}


// 访问节点
void visit(char c, int level)
{
    printf("%c位于第%d 层\n", c, level);
}

// 先序遍历
void PreOrderTraver(BinTree T, int level)
{
    if (T)
    {
        visit(T->data, level);
        PreOrderTraver(T->lchild, level + 1);
        PreOrderTraver(T->rchild, level + 1);
    }
}


// 二叉树查找字符‘B’ 位置 ,并指向此节点
void search(BinTree p, BinTree &q, char ch)
{
    if (p!=NULL)
    {
        if (p->data == ch)
        {
            q = p;
        }
        else {
            search(p->lchild, q, ch);
               if(q==NULL)
               {
                   search(p->rchild, q, ch);
               }
             }
    }
}


// 中序遍历二叉树线索化算法
void InThread(BinTree p,BinTree &pre)
{
    if (p != NULL)
     {
        InThread(p->lchild, pre);
           if (p->lchild==NULL)
                {
                    p->lchild = pre;
                    p->ltag = 1;
                }
     
           if (pre!=NULL&&pre->rchild==NULL)
               {
                   pre->rchild = p;
                    pre->rtag = 1;
               }
            pre = p;
    InThread(p->rchild, pre);
    }
}

// 通过中序二叉树遍历建立中序线索二叉树主程序
void  createInThred(BinTree root)
{
//    BinTree pre = (BiTnode *)malloc(sizeof(BiTnode));
    BinTree pre = NULL;
    if (root != NULL)
    {
        InThread(root, pre);
        pre->rchild = NULL;
        pre->rtag = 1;
    }
}


void MenuTitle()
{
      // 菜单显示
    printf("请根据菜单选择所需要的操作\n");
    printf("\t\t\t  1. 搜索 ‘B’ 节点 ,指向B节点  \t\t\t");
    printf("\n\t\t\t  2. 中序线索化  \t\t\t");
    printf("\n");
    
}

  void Menushow(BinTree T, char ch)
{
      int level = 1;// 层数
      switch (ch)
      {
      case '1': 
      {
          BinTree  T1 = (BinTree)malloc(sizeof(BinTree));
          search(T, T1, 'B');
          printf("先序遍历\n");
          PreOrderTraver(T1, level);
          getchar();
          printf("\n");
          break;
      }

      case '2':
      {
          createInThred(T);
         getchar();
          printf("\n");
          break;
      }

      default:
          break;
      }
}

int main() {

    char s[] = "AB#D##CE###";
    char *p = s;
    int level = 1;// 层数
    BinTree T = NULL;
    //CreateBiTree(&T,p,i);

    // 先序列创建二叉数
    CreateBiTree(&T, p);


    // 先序遍历
    printf("先序遍历\n");
    PreOrderTraver(T, level);
    printf("\n");

    while(1){
    // 提示 
    MenuTitle();
    printf("请输入选择:");
    char ch = getchar();
    Menushow(T,ch);
    //getchar();
    }
    return 0;
}

效果图如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值