数据结构C语言实现-二叉树遍历

一、二叉树简介:

1、概论:

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

2、二叉树的优势:

二叉树在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据较慢,在链表中查找数据项效率较低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。

3、二叉树的构成:

二叉树由节点(node)和边组成。节点分为根节点、父节点、子节点
在这里插入图片描述
如上图,0为根节点,7 ~ 14是3 ~ 6的子节点,3 ~ 6又分别是1 ~ 2的子节点。相反,1 ~ 2是3 ~ 6的父节点,3 ~ 6也是7 ~14的父节点。

二、二叉树简单递归遍历实现:

1、创建树:

typedef struct BiTNode{
    TElemType data;
    struct BiTNode * lchild, * rchild;
}BiTNode,*BiTree;

BiTree CreateBT(){
    TElemType ch;
    BiTree T;
    ch=getchar();
    if(ch =='#'){
        T = NULL;
    }else{
        T = (BiTNode *)malloc(sizeof(BiTNode));
        if(!T) exit(-1);
        T->data = ch;
        T->lchild=CreateBT();
        T->rchild=CreateBT();
    }
    return T;
}

2、先序遍历:

void PreOrder( BiTree T){
    if(T)
    {
        printf("%c\t",T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

3、中序遍历:

void InOrder(BiTree T){
    if(T)
    {
        InOrder(T->lchild);
        printf("%c\t",T->data);
        InOrder(T->rchild);
    }
}

4、后序遍历:

void PostOrder(BiTree T){
    if(T) {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c\t",T->data);
    }
}

5、完整代码:

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

typedef char TElemType;

typedef struct BiTNode{
    TElemType data;
    struct BiTNode * lchild, * rchild;
}BiTNode,*BiTree;

BiTree CreateBT(){
    TElemType ch;
    BiTree T;
    ch=getchar();
    if(ch =='#'){
        T = NULL;
    }else{
        T = (BiTNode *)malloc(sizeof(BiTNode));
        if(!T) exit(-1);
        T->data = ch;
        T->lchild=CreateBT();
        T->rchild=CreateBT();
    }
    return T;
}

void PreOrder( BiTree T){
    if(T)
    {
        printf("%c\t",T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

void InOrder(BiTree T){
    if(T)
    {
        InOrder(T->lchild);
        printf("%c\t",T->data);
        InOrder(T->rchild);
    }
}


void PostOrder(BiTree T){
    if(T) {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c\t",T->data);
    }
}

int main(){
    BiTree T;
    printf("请先序输入二叉树:\n");
    T=CreateBT();

    printf("递归先序遍历:\n");
    PreOrder(T);
    printf("\n");
    
    printf("递归中序遍历:\n");
    InOrder(T);
    printf("\n");
    
    printf("递归后续遍历:\n");
    PostOrder(T);
    printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值