二叉树的先序,中序,后序遍历实现

本文详细介绍了二叉树的三种遍历算法:先序、中序和后序遍历,并通过实例演示了如何实现这些遍历算法。文章提供了完整的C语言代码实现,帮助读者深入理解二叉树遍历的基本概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我们要了解一下,二叉树三种遍历算法的定义:

1.先(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴ 访问根结点;

⑵ 遍历左子树;

⑶ 遍历右子树。

2.中(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵访问根结点;

⑶遍历右子树。

3.后(根)序遍历得递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵遍历右子树;

⑶访问根结点。

示例二叉树:


首先,我们要先建立起这棵二叉树,这个难度不大,仿造链表的初始化和加入元素操作即可,二叉树比链表多了一个指针,链式存储也称为“二叉链表”的形式。因此我们根据以上遍历的递归算法定义,可得出以下完整代码:

#include<cstdio>
#include<cstdlib>

typedef struct node Node;
struct node{
    Node *lchild,*rchild;     //分别指向节点的左孩子和右孩子
    char data;               //用于节点存放数据
};

Node *Creat_node(Node *L,char _data){    //用于建立一棵二叉树,为这棵二叉树的每个节点的数据域以及指针域赋值
    L = (Node *)malloc(sizeof(Node));
    L -> lchild = NULL;
    L -> rchild = NULL;
    L -> data = _data;         //初始化
    return L;
}

Node *Build(Node *root){       //建立一棵二叉树的过程
    root = Creat_node(root,'1');
    root -> lchild = Creat_node(root -> lchild,'2');
    root -> rchild = Creat_node(root -> rchild,'3');
    root -> lchild -> lchild = Creat_node(root -> lchild -> lchild,'4');
    root -> lchild -> rchild = Creat_node(root -> lchild -> rchild,'5');
    root -> rchild -> rchild = Creat_node(root -> rchild -> rchild,'6');
    return root;
}

//先序遍历函数
/*遍历顺序:
 *⑴ 访问根结点;
 *⑵ 遍历左子树;
 *⑶ 遍历右子树。
 */
void preorder(Node *root){
    if(root){               //当前"根"节点不为空则输出根节点的数据域
        printf("%c ",root -> data);
    }
    if(root -> lchild){     //如果当前根节点的左孩子不为空的话
        preorder(root -> lchild);   //那么将当前根节点的左孩子作为新的"根节点",然后重复递归调用先序遍历函数
                                    //直到root -> lchild为空时,那么开始遍历root -> rchild是否为空
    }
    if(root -> rchild){      //当左孩子遍历结束之后,开始遍历当前根节点的右孩子,如果当前根节点的左孩子不为空的话
        preorder(root -> rchild);    //那么将当前根节点的右孩子作为新的"根节点",然后重复递归调用先序遍历函数
                                    //直到root -> rchild为空时,表示该层遍历结束,函数返回上一层
    }
}

//中序遍历函数
/*遍历顺序:
 *⑴遍历左子树;
 *⑵访问根结点;
 *⑶遍历右子树。
 */
 //遍历分析过程与先序遍历类似
void inorder(Node *root){
    if(root -> lchild){
        inorder(root -> lchild);
    }
    if(root){
        printf("%c ",root -> data);
    }
    if(root -> rchild){
        inorder(root -> rchild);
    }
}

//后序遍历函数
/*遍历顺序:
 *⑴遍历左子树;
 *⑵遍历右子树;
 *⑶访问根结点。
 */
 //遍历分析过程与先序遍历类似
void postorder(Node *root){
    if(root -> lchild){
        postorder(root -> lchild);
    }
    if(root -> rchild){
        postorder(root -> rchild);
    }
    if(root){
        printf("%c ",root -> data);
    }
}

int main(){
    Node *root;         //用来表示二叉树的根节点
    root = Build(root);  //建树完成,root作为根节点的树
    printf("先序遍历的结果为:\n");
    preorder(root);      //先序遍历
    printf("\n");
    printf("中序遍历的结果为:\n");
    inorder(root);      //中序遍历
    printf("\n");
    printf("后序遍历的结果为:\n");
    postorder(root);      //后序遍历
    printf("\n");
    return 0;
}


效果示意:




二叉树属于数据结构中的重点部分,要多花时间琢磨。


如有错误,还请指正,O(∩_∩)O谢谢




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值