zoukankan      html  css  js  c++  java
  • 二叉树的创建与遍历算法-C语言

    1.实验要求

    实现二叉树的创建算法与中序列遍历算法。
    步骤如下:

    1. 将二叉树模拟成完全二叉树,从根结点开始对所有结点进行编号,编号从1开始,在运行过程中输入结点对应的编号和值,最后以编号i=0,结点值x=’$’为循环结束条件;
    2. 中序遍历已建立的二叉树,并输出遍历结果,中序遍历算法可选择递归和非递归方法。

    2.代码

    //Authors:xiaobei
    
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct BiTNode{
     int data;
     struct BiTNode *lchild, *rchild;
    }BiTNode,*BiTree;     //树节点的定义 ,采用二叉链表形式 
    void CreateBiTree(BiTree &T);
    void InOrderTraverse(BiTree T);
    void PrintMenu();
    int main(){
     int user;
     BiTree T = NULL;
     while (1){
      PrintMenu();
      scanf("%d",&user);
      if(user==1)
       CreateBiTree(T);
      else if(user==2)
       InOrderTraverse(T);
      else if(user==0)
       break;
      else
       printf("[输入错误!]
    ");
     }
    }
    //先序建立二叉树 
    void CreateBiTree(BiTree &T){
     char ch;
     int i;
     printf("
    (请输入编号和值)
    >>>");
     scanf("%d %c",&i,&ch);
     printf("%d %c",i,ch);
     if(i==0 && ch=='$'){     //递归结束条件 
      T = NULL;
      printf("
    [此分支结束!]");
     }
     else{
      T = (BiTree)malloc(sizeof(BiTNode));//分配空间 
      T->data = ch;
      CreateBiTree(T->lchild);   //递归创建左子树 
      CreateBiTree(T->rchild);   //递归创建右子树 
     }
    }
    //中序遍历二叉树 
    void InOrderTraverse(BiTree T){
     if(T){
      InOrderTraverse(T->lchild);   //递归遍历左子树 
      printf("%c",T->data);    //访问根节点 
      InOrderTraverse(T->rchild);   //递归遍历右子树 
     }
    }
    //打印菜单 
    void PrintMenu(){
     printf("
    ------------------
    ");
     printf("1、先序建立二叉树
    ");
     printf("2、中序遍历二叉树
    ");
     printf("0、退出
    ");
     printf("------------------
    ");
     printf("(请输入选择)
    >>>");
    }

    3.结果展示

    结果
    结果

    4.分析

    二叉树递归示意图
    先序递归创建二叉树(如上图)输入顺序:

    1 A
    2 B
    3 C
    0 $
    0 $
    4 D
    0 $
    0 $
    5 E
    6 F
    0 $
    0 $
    7 G
    0 $
    0 $

    中序递归输出结果:

    C->B->D->A->F->E->G

    三种顺序 (前序、中序、后序) 递归遍历的操作,都类似,只要改变输出 (操作) 语句的顺序,即可实现。

    如果去掉输出 (操作) 语句,从递归的角度看,三种遍历算法路径相同,只是访问的时机不同,每个节点都路过三次。

  • 相关阅读:
    c语言练习17——输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
    c语言练习16——输入两个正整数m和n,求其最大公约数和最小公倍数
    c语言练习15——条件运算符的嵌套
    c语言练习14——将一个正整数分解质因数
    CentOS下Cassandra集群搭建
    一台linux服务器挂载另外一台linux服务器文件系统
    zabbix分布式监控多网段的部署与实现
    CentOS安装MySQL详解
    vcenter 7.0 安装 vRealize Operations Manager
    Zabbix分布式部署详细
  • 原文地址:https://www.cnblogs.com/slz99/p/12527738.html
Copyright © 2011-2022 走看看