【3/19补充版】二叉树的生成和遍历教程

  • 定义

二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常被称为左子节点和右子节点。

二叉树是有限个元素的集合,该集合要么为空(称为空二叉树),要么由一个根元素和两个被分别称为左子树和右子树的不相交的二叉树组成。

                                                                  图1.二叉树的图示

  • 链式存储结构:二叉树的链式存储结构通常由节点组成,每个节点包含一个数据字段和两个指针字段。数据字段用于存储节点值,两个指针字段分别指向左子节点和右子节点。如果某个节点没有子节点,那么相应的指针字段就为NULL。

在C语言中,二叉树的链式存储结构可以定义如下:

typedef struct Node {
      int data;
      struct Node* left;
      struct Node* right;
    }
 Node;

                                                      图2.二叉树的链式存储结构

遍历方法:二叉树有三种基本的遍历方法:前序遍历、中序遍历和后序遍历。

1. 先序遍历:首先访问根节点,然后前序遍历左子树,最后前序遍历右子树。

void preOrder(Node* root) {
    if (root != NULL) {
        printf("%d ", root->data);
        preOrder(root->left);
        preOrder(root->right);
    }
}

2. 中序遍历:首先中序遍历左子树,然后访问根节点,最后中序遍历右子树。

void inOrder(Node* root) {
    if (root != NULL) {
        inOrder(root->left);
        printf("%d ", root->data);
        inOrder(root->right);
    }
}

3. 后序遍历:首先后序遍历左子树,然后后序遍历右子树,最后访问根节点。

void postOrder(Node* root) {
    if (root != NULL) {
        postOrder(root->left);
        postOrder(root->right);
        printf("%d ", root->data);
    }
}

      

  • 创建二叉树和进行遍历的步骤

1. 先定义二叉树结构体BTnode,包括数据data和左右子节点Lchild和Rchild。

2. 然后定义CreatNode函数,用于创建新的二叉树节点,并初始化节点的数据和左右子节点。

3. 接着定义preorder、inorder和postorder三个函数,分别实现先序遍历、中序遍历和后序遍历的功能。

4. 在main函数中,创建一个二叉树,并初始化节点的数据和左右子节点。

5. 最后调用preorder、inorder和postorder三个函数,分别输出先序遍历、中序遍历和后序遍历的结果。

                                                                    图3.结果

  • 在编写中容易出现的问题及解决方法

在编写主函数的初始化节点的数据和左右子节点这一过程时,没有将无左右子节点的叶子的情况说明清楚导致出现问题,解决方法是将代码补充完整,用‘.’来说明清楚。

  • 总结体会

通过编写这个程序,深刻理解了二叉树的遍历方式以及递归的思想。二叉树的遍历方式有先序遍历、中序遍历和后序遍历,每种遍历方式都有其特定的输出顺序。而递归是实现二叉树遍历的核心思想,通过递归函数不断访问左右子节点,直到遇到空节点为止。

  • 代码部分

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

typedef struct Node{
    char data;
    struct Node *Lchild;
    struct Node *Rchild;
}
BTnode;

BTnode *CreatNode(char data){
    BTnode *newnode=(BTnode*)malloc(sizeof(BTnode));
    if(newnode==NULL)
        exit(1);
    newnode->data=data;
    newnode->Lchild=NULL;
    newnode->Rchild=NULL;
    return newnode;
}


void preorder(BTnode *root)
{

    if(root==NULL)
        return;
    else{
        printf("%c",root->data);
        preorder(root->Lchild);
        preorder(root->Rchild);
    }
}


void inorder(BTnode *root)
{

    if(root==NULL)
        return;
    else{
        inorder(root->Lchild);
        printf("%c",root->data);
        inorder(root->Rchild);
    }
}


void postorder(BTnode *root)
{

    if(root==NULL)
        return;
    else{
        postorder(root->Lchild);
        postorder(root->Rchild);
        printf("%c",root->data);
    }
}


int main()
{

    BTnode *root=CreatNode('A');
    root->Lchild=CreatNode('B');
    root->Lchild->Lchild=CreatNode('D');
    root->Lchild->Rchild=CreatNode('.');
    root->Lchild->Lchild->Lchild=CreatNode('.');
    root->Lchild->Lchild->Rchild=CreatNode('G');
    root->Lchild->Lchild->Rchild->Lchild=CreatNode('.');
    root->Lchild->Lchild->Rchild->Rchild=CreatNode('.');
    root->Rchild=CreatNode('C');
    root->Rchild->Lchild=CreatNode('E');
    root->Rchild->Rchild=CreatNode('F');
    root->Rchild->Rchild->Lchild=CreatNode('.');
    root->Rchild->Rchild->Rchild=CreatNode('.');
    root->Rchild->Lchild->Lchild=CreatNode('.');
    root->Rchild->Lchild->Rchild=CreatNode('H');
    root->Rchild->Lchild->Rchild->Lchild=CreatNode('.');
    root->Rchild->Lchild->Rchild->Rchild=CreatNode('.');
    
    
printf("先序遍历:");
    preorder(root);
    printf("\n");
    
    
printf("中序遍历:");
    inorder(root);
    printf("\n");
    
    
printf("后序遍历:");
    postorder(root);
    printf("\n");
    
    
return 0;
}

 

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构算法实现(严蔚敏配套实现程序) 1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 范例1-4 显示杨辉三角 7 ∷相关函数:c函数 8 1.1.5 魔方阵 9 范例1-5 魔方阵 9 1.1.6 三维数组的表示 14 范例1-6 三维数组的表示 14 ∷相关函数:InitArray函数 1.1.7 多项式的数组表示 17 范例1-7 多项式数组的表示 17 1.1.8 查找矩阵的马鞍点 19 范例1-8 查找矩阵的马鞍点 19 ∷相关函数:Get_Saddle函数 1.1.9 对角矩阵建立 21 范例1-9 对角矩阵建立 21 ∷相关函数:Store函数 1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相关函数:Store函数 1.1.11 三角矩阵建立 24 范例1-11 三角矩阵建立 24 ∷相关函数:Store函数 1.1.12 对称矩阵的建立 25 范例1-12 对称矩阵的建立 25 ∷相关函数:store函数 1.1.13 字符串长度的计算 28 范例1-13 字符串长度的计算 28 ∷相关函数:strlen函数 1.1.14 字符串的复制 29 范例1-14 字符串的复制 29 ∷相关函数:strcpy函数 1.1.15 字符串的替换 31 范例1-15 字符串的替换 31 ∷相关函数:strrep函数 1.1.16 字符串的删除 33 范例1-16 字符串的删除 33 ∷相关函数:strdel函数 1.1.17 字符串的比较 35 范例1-17 字符串的比较 35 ∷相关函数:strcmp函数 1.1.18 字符串的抽取 36 范例1-18 字符串的抽取 36 ∷相关函数:substr函数 1.1.19 字符串的分割 38 范例1-19 字符串的分割 38 ∷相关函数:partition函数 1.1.20 字符串的插入 40 范例1-20 字符串的插入 40 ∷相关函数:insert函数 1.1.21 字符串的匹配 42 范例1-21 字符串的匹配 42 ∷相关函数:nfind函数 1.1.22 字符串的合并 43 范例1-22 字符串的合并 43 ∷相关函数:catstr函数 1.1.23 文本编辑 45 范例1-23 文本编辑 45 ∷相关函数:StrAssign函数 1.2 栈和队列 54 1.2.1 用数组仿真堆栈 54 范例1-24 用数组仿真堆栈 54 ∷相关函数:push函数 pop函数 1.2.2 用链表仿真堆栈 57 范例1-25 用链表仿真堆栈 57 ∷相关函数:push函数 pop函数 1.2.3 顺序栈公用 59 范例1-26 顺序栈公用 59 ∷相关函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相关函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相关函数:push函数 pop函数 1.2.6 循环队列 66 范例1-29 循环队列 66 ∷相关函数:EnQueue函数 DeQueue函数 1.2.7 链队列的入队、出队 69 范例1-30 链队列入队、出队 69 ∷相关函数:push函数 pop函数 1.2.8 舞伴问题 71 范例1-31 舞伴问题 71 ∷相关函数:EnQueue函数 DeQueue函数 DancePartner函数 1.3 链表 75 1.3.1 头插法建立单链表 75 范例1-32 头插法建立单链表 75 ∷相关函数:createlist函数 1.3.2 限制链表长度建立单链表 77 范例1-33 限制链表长度建立长单链表 77 ∷相关函数:createlist函数 1.3.3 尾插法建立单链表 79 范例1-34 尾插法建立单链表 79 ∷相关函数:createlist函数 1.3.4 按序号查找单链表 80 范例1-35 按序号查找单链表 80 ∷相关函数:getnode函数 1.3.5 按值查找单链表 82 范例1-36 按值查找单链表 82 ∷相关函数:locatenode函数 1.3.6 链表的插入 84 范例1-37 链表的插入 84 ∷相关函数:insertnode函数 1.3.7 链表的删除 86 范例1-38 链表的删除 86 ∷相关函数:deletelist函数 1.3.8 归并两个单链表 88 范例1-39 归并两个单链表 88 ∷相关函数:concatenate函数

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值