数据结构之二叉树的三种遍历实现(C语言版)

在昨天发表的二叉树的基础知识后,博主趁热打铁来分享一下《数据结构之二叉树的三种遍历实现代码》,虽然准确的来说,是四种遍历方式,由于层次遍历比较简单,考试做题遇到的比较少,这里就不多说了。在分享代码之前,博主想说自己在写这代码踩到的坑,我想很多新手朋友在以后写的树的代码时大概率也会想博主一样踩这坑。踩坑不是什么坏事,暴露出来就要改正对吧。好啦,不转弯抹角啦,其实就是在树的结点分配内存时要注意申请的空间不要太小。注意指针类型和数据类型的空间大小的区别。指针类似是八个字节,数据类型要看情况,像结构体的大小是要把里面的数据类型的大小全部加起来。让我们下面一起来看看代码,在代码中体会吧(踩坑点博主会加深颜色哦)

实现代码:

#include <stdio.h>
#include <stdlib.h>
#include<string>
typedef char ElemType;
//定义结点数据结构
typedef struct BiTNode
{
    ElemType data;
    struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;//前一个是数据类型,后一个是指针类型
//插入根结点
void InRoot(BiTree& T, ElemType i) {
    T = (BiTree)malloc(sizeof(BiTNode));//注意要申请数据类型的空间。否则会因太小而报错
    T->data = i;
    T->lchild = NULL;
    T->rchild = NULL;
}
//插入新结点
void InNew(BiTree& p, ElemType i)
{
    p = (BiTree)malloc(sizeof(BiTNode));//注意要申请数据类型的空间。否则会因太小而报错
    p->data = i;
    p->lchild = p->rchild = NULL;
}
//访问结点的操作
void visit(BiTree T) {
    printf(" %c\n", T->data);
}
//先序遍历
void PreOrder(BiTree T) {
    if (T != NULL) {
        visit(T);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
//中序遍历
void InOrder(BiTree T) {
    if (T != NULL) {
        InOrder(T->lchild);
        visit(T);//访问根节点
        InOrder(T->rchild);
    }
}
//后序遍历
void PostOrder(BiTree T)
{
    if (T != NULL)
    {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        visit(T);
    }
}
//构造一个树
void CreatTree(BiTree& T)
{
    
    InRoot(T,'a');
    InNew(T->lchild,'b');
    InNew(T->rchild,'c');
    BiTree p = T->lchild;
    BiTree q = T->rchild;
    InNew(p->lchild,'d');
    InNew(p->rchild,'e');
    InNew(q->lchild,'f');
    InNew(q->rchild,'g');
    InNew(q->lchild,'h');
    InNew(q->rchild,'j');
}
int main() {
    BiTree T;
    CreatTree(T);
    printf("先序遍历:\n");
    PreOrder(T);
    printf("中序遍历:\n");
    InOrder(T);
    printf("后序遍历:\n");
    PostOrder(T);
}

程序执行图:

在看完之余,建议大家上机去敲一敲,多实践,毕竟想学好编程时离不开上机实践的。有兴趣的同学可以把上面的代码的数据类型换为整数或大写字母哦。好啦,今天就分享到这啦。

本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.


 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现二叉树的层序遍历需要用到队列这一数据结构,具体实现步骤如下: 1. 定义一个队列结构体,并实现队列的基本操作,包括入队、出队、队列是否为空等。 ``` typedef struct QueueNode { TreeNode *val; struct QueueNode *next; } QueueNode; typedef struct { QueueNode *front; QueueNode *rear; int size; } Queue; Queue *createQueue() { Queue *q = (Queue*)malloc(sizeof(Queue)); q->front = q->rear = NULL; q->size = 0; return q; } bool isEmpty(Queue *q) { return q->size == 0; } void enqueue(Queue *q, TreeNode *val) { QueueNode *newNode = (QueueNode*)malloc(sizeof(QueueNode)); newNode->val = val; newNode->next = NULL; if (isEmpty(q)) { q->front = q->rear = newNode; } else { q->rear->next = newNode; q->rear = newNode; } q->size++; } TreeNode *dequeue(Queue *q) { if (isEmpty(q)) { return NULL; } QueueNode *node = q->front; TreeNode *val = node->val; q->front = q->front->next; if (q->front == NULL) { q->rear = NULL; } free(node); q->size--; return val; } ``` 2. 实现二叉树的层序遍历,使用队列来存储当前层的节点,并逐层遍历。 ``` void levelOrder(TreeNode *root) { if (root == NULL) { return; } Queue *q = createQueue(); enqueue(q, root); while (!isEmpty(q)) { int levelSize = q->size; for (int i = 0; i < levelSize; i++) { TreeNode *node = dequeue(q); printf("%d ", node->val); if (node->left != NULL) { enqueue(q, node->left); } if (node->right != NULL) { enqueue(q, node->right); } } printf("\n"); } } ``` 以上代码实现二叉树的层序遍历,可以通过以下测试代码进行测试: ``` int main() { TreeNode *root = createTree(); printf("层序遍历结果:\n"); levelOrder(root); return 0; } ``` 其中,`createTree()` 是创建一个二叉树的函数,可以根据需要自行实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值