数据结构-二叉树的建立与遍历

二叉树的遍历

在遍历二叉树有四种方法

二叉树的遍历原理

  • 二叉树的遍历(traversing binary tree)

  • 是指从根节点除法,按照某种次序一次访问二叉树中的所有结点

  • 使得每个结点被访问一次 , 且仅被访问一次

  • 关键词,访问和次序

  • 访问:

    • 访问其实是要根据实际的需要来确定具体做什么,比如计算,或者输出
      这里的访问算是一个抽象操作,我们简单的假设访问就是输出结点的数据信息
  • 次序:

    • 树和线性表的遍历方式不同的,线性表一般是从头到尾,
    • 我们限制树的遍历次序,遍历次序是从左至右

    二叉树遍历方法
    主要有四种

    • 前序遍历(先序)
      规则是若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,在前序遍历右子树,
      • 先输出根,在访问根的左子树,在先序遍历跟的左子树,之后是右子树

      • 如下图

      • 遍历的顺序为:ABDECFG

      • 遍历设计的递归,我们可以理解为对于每一个结点都做了一次函数

      • 在这里插入图片描述

  • 中序遍历

    • 规则是若树为空,则空操作返回,否则从根节点开始(注意并不是先访问根节点)
      中序遍历左子树,然后是访问根节点 ,再中序遍历右子树
    • 记住规律,访问根,中序遍历左子树,左子树到头了输出左子树的信息 在输出根的信息
      然后在输出根节点的信息,在对右子树做同样的事情
      • 下图中序遍历输出:DBEAFCG
      • 在这里插入图片描述
  • 后序遍历

    • 规则是若树为空,则空操作返回,否则从左到右先叶子后节点的方式遍
      历访问左右子树,
      • 下图后序遍历输出:DEBFGCA
      • 在这里插入图片描述
  • 层序遍历

    • 规则是若树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问
      从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问

      • 如下图层序遍历的输出:ABCDEFG
      • 在这里插入图片描述

      代码

先序生成二叉树
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
typedef char ElementTypec ;
typedef struct Tnode * BiTree;
typedef struct Tnode{
        ElementTypec data; // 结点值是字符类型
        BiTree Left;       //左子树的指针
        BiTree Right;      //右子树的指针
}Tnode;
void CreatBiTree( BiTree* T);
void PreOrderTraverse(BiTree T) ;
int main()
{
        BiTree p ;
        CreatBiTree(&p);
        PreOrderTraverse(p);
        return 0 ;

}

void CreatBiTree( BiTree* T)  //先序创建二叉树
{
        ElementTypec ch;
        scanf("%c",&ch);
        if( ch =='#')
        {
                *T = NULL;// 让这个结点指向空
        }else{
                *T = (BiTree)malloc(sizeof(Tnode)); // T = &p *T = malloc == p = malloc = &Tnode 
                if(!T) 
                exit(OVERFLOW);
                (*T)->data = ch; //将字符给数据域 生成根节点
                CreatBiTree(&(*T)->Left); // 递归调用自己生成左子树
                CreatBiTree(&(*T)->Right);// 递归调用自己生成左子树
        }
}
void PreOrderTraverse(BiTree T)  //先序遍历二叉树
{
        if(!T)
         return ;
         printf("%c",T->data);//先输出根节点
         PreOrderTraverse(T->Left);  //递归遍历左子树
         PreOrderTraverse(T->Right); //递归遍历右子树
         
}

遍历输出的结果
下图是中序遍历但我用的是前序遍历
在这里插入图片描述前序遍历的结果

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值