• C语言二叉树


    二叉树使用链做结构,其结构体有存储数据的变量和指向左右孩子的指针

    1 typedef char elemtype;
    2 
    3 typedef struct BiTreeNode{
    4     elemtype date;
    5     struct BiTreeNode *lchild;
    6     struct BiTreeNode *rchild;
    7 }BiTreeNode, *BiTree;

    二叉树的一般遍历方法(假设先左子树再右子树)有3个,根节点作为访问的先后条件。

     1 //后序遍历 
     2 void postOrd(BiTree biTree){
     3     
     4     if(biTree!=NULL){
     5         postOrd(biTree->lchild);
     6         postOrd(biTree->lchild);
     7         printf("%c",biTree->date);
     8         return ;
     9     }
    10     return ;
    11     
    12 }
    13 
    14 //中序遍历 
    15 void inOrd(BiTree biTree){
    16     
    17     if(biTree!=NULL){
    18         inOrd(biTree->lchild);
    19         printf("%c",biTree->date);
    20         inOrd(biTree->rchild);
    21         return ;
    22     }
    23     return ;
    24     
    25 }
    26 
    27 //前序遍历 
    28 void preOrd(BiTree biTree){
    29     
    30     if(biTree!=NULL){
    31         printf("%c",biTree->date);
    32         preOrd(biTree->lchild);
    33         preOrd(biTree->rchild);
    34         return ;
    35     }
    36     return ;
    37 }

    结合先序和中序遍历序列创建二叉树:

    设先序遍历序列和中序遍历序列分别为"ABCDEFG"、"CBDAEGF",分别对应1式和2式。从2式开头找一个字符与1式的第一个字符相同的字符A,把2式中A左右两边分为左子树和右子树,根据2式的左右子树再把1式分为左右子树,即两式的左右子树内容要相同。1式分为1.1(左BCD)和1.2(右EFG)两式,2式分为2.1(左CBD)和2.2(右EGF)两式。这个时候把A作为根节点存入二叉树中(必须是根节点才能存入)。递归进入下一步,比较1.1和2.1式:此时B为根节点,B左右两边C、D分别就是左右子树了。再比较1.2和2.2式:2.2式中E在最左边,E是根节点但没有左子树(如果2.2式中E在最右边则E没有右子树)。再递归比较"FG"和"GF",同上,二叉树建立完毕。

     1 //把先序和中序遍历排好序的数组传入数组,i、j和m、n分别为对应数组的0下标和尾下标 
     2 BiTree init_BiTree(char preord[],char inord[],int i,int j,int m,int n){
     3     
     4     BiTree biTree = (BiTreeNode *)malloc(sizeof(BiTreeNode));
     5     if(biTree == NULL)
     6         return NULL;
     7     
     8     biTree->date = preord[i];
     9 
    10     int k = m;
    11     
    12     while(preord[i]!=inord[k])
    13         k++;
    14     
    15     //左子树的建立 
    16     if(k == m)
    17         biTree->lchild = NULL;
    18     else
    19         biTree->lchild = init_BiTree(preord,inord,i+1,i+k-m,m,k-1);
    20         /*特别注意数组下标的范围传入,i,j和m、n与k。必须要有数组原本的开头或者结束的下标值*/
    21         
    22     //右子树的建立 
    23     if(k == n) 
    24         biTree->rchild = NULL;
    25     else
    26         biTree->rchild = init_BiTree(preord,inord,i+k-m+1,j,k+1,n);
    27         /*特别注意数组下标的范围传入,i,j和m、n与k。必须要有数组原本的开头或者结束的下标值*/
    28     
    29     return biTree;
    30 }
    31 
    32 BiTree createBiTree(char preord[],char inord[],int i){
    33     
    34     BiTree init_BiTree(char preord[],char inord[],int i,int j,int m,int n);
    35     
    36     BiTree biTree;
    37     if(i<=0)    
    38         biTree = NULL;
    39     
    40     biTree = init_BiTree(preord,inord,0,i-1,0,i-1);
    41     return biTree;
    42     
    43 }

    试运行:

     1 void main(){
     2     
     3     BiTree init_BiTree(char preord[],char inord[],int i,int j,int m,int n);
     4     BiTree createBiTree(char preord[],char inord[],int i);
     5     void preOrd(BiTree biTree);
     6     void inOrd(BiTree biTree); 
     7     void postOrd(BiTree biTree); 
     8     
     9     char preord[7] = {'A','B','C','D','E','F','G'};
    10     char inord[7] = {'C','B','D','A','E','G','F'};
    11     
    12     BiTree biTree = createBiTree(preord,inord,7);
    13     preOrd(biTree);
    14     
    15 }

  • 相关阅读:
    Mybatis学习随笔3
    Mybatis学习随笔2
    Mybatis学习随笔
    Java校招面试-什么是线程安全/不安全
    装饰器2
    装饰器
    默认传参的陷阱
    处理日志文件
    第二天
    用户登录
  • 原文地址:https://www.cnblogs.com/lsy-lsy/p/10033890.html
Copyright © 2020-2023  润新知