• 二叉树的简介及链式结构实现


    二叉树:每个结点的直接子结点最多只能有两个,且有左右之分。

    完全二叉树:除最后一层外,每一层结点数为2^(i-1)个,最后一层的结点数若不满足2^(i-1),那么最后一层结点是自左向右排列的。

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #define TRUE 1
      5 #define FALSE 0
      6 #define OVERFLOW -2
      7 #define OK 1
      8 #define ERROR 0
      9 
     10 typedef int Status;
     11 typedef int TElemType;
     12 
     13 /*
     14  * 存储结构
     15  */
     16 typedef struct BiTNode
     17 {
     18     TElemType data;    //数据
     19     struct BiTNode *lchild, *rchild;
     20 }BiTNode, *BiTree;
     21 
     22 /*
     23  * 创建二叉树,输入0表示创建空树
     24  */
     25 Status CreateBiTree(BiTree *T)
     26 {
     27     TElemType e;
     28     scanf("%d", &e);
     29     if (e == 0)
     30     {
     31         *T = NULL;
     32     }
     33     else
     34     {
     35         *T = (BiTree) malloc(sizeof(BiTNode));
     36         if (!T)
     37         {
     38             exit(OVERFLOW);
     39         }
     40         (*T)->data = e;
     41         CreateBiTree(&(*T)->lchild);    //创建左子树
     42         CreateBiTree(&(*T)->rchild);    //创建右子树
     43     }
     44     return OK;
     45 }
     46 
     47 /*
     48  * 访问元素
     49  */
     50 void visit(TElemType e)
     51 {
     52     printf("%d ", e);
     53 }
     54 
     55 /*
     56  * 先序遍历二叉树:指先访问根,然后访问孩子的遍历方式
     57  */
     58 Status PreOrderTraverse(BiTree T, void (*visit)(TElemType))
     59 {
     60     if (T)
     61     {
     62         visit(T->data);
     63         PreOrderTraverse(T->lchild, visit);
     64         PreOrderTraverse(T->rchild, visit);
     65     }
     66 }
     67 
     68 /*
     69  * 中序遍历二叉树:指先访问左(右)孩子,然后访问根,最后访问右(左)孩子的遍历方式
     70  */
     71 Status InOrderTraverse(BiTree T, void (*visit)(TElemType))
     72 {
     73     if (T)
     74     {
     75         InOrderTraverse(T->lchild, visit);
     76         visit(T->data);
     77         InOrderTraverse(T->rchild, visit);
     78     }
     79 }
     80 
     81 /*
     82  * 后序遍历二叉树:指先访问孩子,然后访问根的遍历方式
     83  */
     84 Status PostOrderTraverse(BiTree T, void (*visit)(TElemType))
     85 {
     86     if (T)
     87     {
     88         PostOrderTraverse(T->lchild, visit);
     89         PostOrderTraverse(T->rchild, visit);
     90         visit(T->data);
     91     }
     92 }
     93 
     94 int main()
     95 {
     96     BiTree T;
     97     printf("创建树,输入0为空树:
    ");
     98     CreateBiTree(&T);
     99     printf("先序遍历:");
    100     PreOrderTraverse(T, *visit);
    101     printf("
    中序遍历:");
    102     InOrderTraverse(T, *visit);
    103     printf("
    后序遍历:");
    104     PostOrderTraverse(T, *visit);
    105     printf("
    ");
    106 }
  • 相关阅读:
    macOS10.9+xcode6编译ffmpeg2.4.2 for ios
    [think in java]第12章 通过异常处理错误
    机房合作感受
    LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
    Java继承
    jQuery学习笔记之DOM操作、事件绑定(2)
    intellij IDEA常见操作
    log4j.properties配置详解
    jQuery学习笔记之概念(1)
    VC常用代码之创建进程
  • 原文地址:https://www.cnblogs.com/niceforbear/p/4529080.html
Copyright © 2020-2023  润新知