二叉树基本概念以及遍历代码的实现

/*
    ONE.二叉树基本常识

          二叉树结构单体:有一个数据域,加上左子树指针和右子树指针,就是结构体写法
        
         ONE.ONE.基本概念:
                 二叉树有五种形态
                    第一种:空的二叉树,就是一个结构体指针
                    第二种:只有根节点的二叉树(只有一个根节点,用tree指针表示)
                    第三种:只有左子树或右子树的二叉树(左子树:在结点左边的指针。右子树同理),就是单纯的单链表。。。
                    第四种:左右子树都存在
                    {
                             四.1.完全二叉树(除了最后一个节点之外,其他的都是满的,不过叶子结点可以缺少,但最后的不能左右都空,它从编号一开始,有孩子结点,父结点,兄弟节点,等等,父结点就是孩子节点的上面,编号从一开始,是为了实现孩子节点的序号 \ 2 = 父结点的序号,小数直接忽略)
                             四.2.满二叉树(除了叶子之外,其他的都是满的,叶子结点就是最后一层结点,不过左右子树都要完整的)
                    }

          TWO.二叉树的遍历,就是不重复去打印
          根节点最是最上面的那个,就是根
          我们一般是用从左往右的顺寻
               假设只有三个结构单体  
                                                         { 
                                                                1.先打印上方,然后再按从左往右打印
                                                                2.就只按从左往右打印,不管上与下的关系
                                                                3.先打印下面的从左往右,然后再打印上面的
                                                         }
                  所以我们看根节点在哪里,就是什么遍历方式
                  1.根在最前面,就是前序遍历,也叫先序遍历
                  2.根在中间,中序
                  3.跟在最后面,后序
                          

           在这里无法描述,因为我不懂如何插入图片
*/


#include<stdio.h>
#include<stdlib.h>


//描述单一个体,起别名
typedef   struct   treeNode
{
		char    data;  //数据域用字符表示
		struct   treeNode* LChild;    //左子树指针
		struct   treeNode*RChild;    //右子树指针
}TREE,*LPTREE;   //一般用用LP开头的,表示指针别名


//创建二叉树结点
LRTREE   createNode(char   data)
{
         LRTREE   newNode = (LRTREE)malloc(sizeof(TREE));
         newNode->data = data;
         newNode->LChild = NULL;
         newNode->RChild = NULL;
         return   newNode;
}


//没有规律的树
void   insertNode(LRTREE    parentNode,LRTREE    LChild,  LRTREE   RChild)
{
          parentNode->LChild = LChild;
          parentNode->RChild = RChild;
}


//打印当前节点的元素
void    printCurNodeData(LRTREE   curData)
{
         printf("%c\t", cruData->data);
}


//递归法
//先序:根->左->右
void   preOrder(LRTREE    root)
{
       if(root  !=  NULL)
       {
               printCurNodeData(root);  //打印根部节点,到左节点,最后右节点
               preOrder(root->LChild);
               preOrder(root->RChild);
               //同样用了preOrder函数,使根节点,左节点,右节点都打印
       }
}


//中序:左->根->右
void   midOrder(LRTREE    root)
{
       if(root  !=  NULL)
       {
                midOrder(root->LChild);//打印左节点,到根节点,最后右节点
                printCurNodeData(root);
               midOrder(root->RChild);
               //同样用了midOrder函数,使根节点,左节点,右节点都打印
       }
}


//后序:左->右->根
void   lastOrder(LRTREE    root)
{
       if(root  !=  NULL)
       {
               lastOrder(root->LChild);//打印左节点,到右节点,最后根节点 
               lastOrder(root->RChild);
               printCurNodeData(root);
               //同样用了lastOrder函数,使根节点,左节点,右节点都打印
       }
}



int  main()
{
     /*死板的创建方式,无实际作用,就是将结点连接起来而已*/
     LRTREE    A = createNode('A');
     LRTREE    B = createNode('B');
     LRTREE    C = createNode('C');
     LRTREE    D = createNode('D');
     LRTREE    E = createNode('E');
     LRTREE    F = createNode('F');
     LRTREE    G = createNode('G');
     insertNode(A , B ,C);
     insertNode(B , D ,NULL);
     insertNode(C , E ,F);
     
     printf("\n先序遍历:\n");
     preOrder(A);

      printf("\n中序遍历:\n");
      midOrder(A);

     printf("\n中序遍历:\n");
     lastOrder(A);
     
     system("pause");
     return  0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值