二叉树的创建与遍历


文章目录

  • 二叉树的创建与遍历
  • 前言
  • 一、二叉树的结构
  • 二、二叉树创建和三种遍历
    • 1.
    • 2.前序遍历
    • 3.中序遍历
    • 4.后序遍历
    • 5.测试代码
  • 总结

前言

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。以下是对链式存储结构的二叉树的创建与先序、中序、后序遍历操作。


一、二叉树的结构

typedef struct Node {                                //定义Node节点char data;                                        //data数据域struct Node* Lchild;                           //左孩子struct Noed* Rchild;                           //右孩子
}Node;

二、二叉树创建和三种遍历

1.

代码如下(示例):

void creatTree(Node** tree,char* data,int* index)    //创建树,这里使用二级指针是因为当tree创建其左右孩子时需要使用到二级指针指向他们的数据域以及指针域
{char temp;                                     //temp用于保存data里面的数据temp = data[*index];                            //index是为了方便对全局变量的操作*index += 1;                                  //*index改变索引值if (temp == '#')                               //如果temp值为#{*tree = NULL;                              //tree指向NULL}else{*tree = (Node*)malloc(sizeof(Node));     //如果不等于#,则对其开辟空间保存(*tree)->data = temp;                      /*data数据域进行赋值*/creatTree(&((*tree)->Lchild),data,index); //创建树的左孩子,这里传入变量tree的指向的Lchild并且对其进行取地址符creatTree(&((*tree)->Rchild),data,index); //如上使用遍历的方法进行创建}
}

2.前序遍历

代码如下(示例):

void printf_preTree(Node* tree)                      //前序遍历,先是根,然后是左孩子,最后是右孩子
{if (tree == NULL)                                //如果指向NULL则直接返回{return;}else{printf("%c->",tree->data);                 //先打印根的dataprintf_preTree(tree->Lchild);             //再使用遍历的方法对Lchild进行打印printf_preTree(tree->Rchild);               //如上打印Rchild}
}

3.中序遍历

代码如下(示例):

void printf_ioTree(Node* tree)                       //中序遍历,先是左孩子,然后就是根,再然后就是右孩子
{if (tree == NULL){return -1;}else{printf_preTree(tree->Lchild);               //先找到最左的孩子printf("%c->", tree->data);                   //然后打印dataprintf_preTree(tree->Rchild);              //再去打印根的孩子,最后会回到右孩子打印}
}

4.后序遍历

代码如下(示例):

void printf_lastTree(Node* tree)                 //尾序打印,先打印左孩子,再右孩子,最后就是根
{if (tree == NULL){return -1;}else{printf_lastTree(tree->Lchild);              //找到左边的孩子printf_lastTree(tree->Rchild);              //找到右边的孩子printf("%c->", tree->data);                    //打印右边的孩子}
}

5.测试代码

代码如下(示例):

#include<stdio.h>
#include<stdlib.h>typedef struct Node {                               //定义Node节点char data;                                        //data数据域struct Node* Lchild;                           //左孩子struct Noed* Rchild;                           //右孩子
}Node;void creatTree(Node** tree,char* data,int* index) //创建树,这里使用二级指针是因为当tree创建其左右孩子时需要使用到二级指针指向他们的数据域以及指针域
{char temp;                                     //temp用于保存data里面的数据temp = data[*index];                            //index是为了方便对全局变量的操作*index += 1;                                  //*index改变索引值if (temp == '#')                               //如果temp值为#{*tree = NULL;                              //tree指向NULL}else{*tree = (Node*)malloc(sizeof(Node));     //如果不等于#,则对其开辟空间保存(*tree)->data = temp;                      /*data数据域进行赋值*/creatTree(&((*tree)->Lchild),data,index); //创建树的左孩子,这里传入变量tree的指向的Lchild并且对其进行取地址符creatTree(&((*tree)->Rchild),data,index); //如上使用遍历的方法进行创建}
}void printf_preTree(Node* tree)                        //前序遍历,先是根,然后是左孩子,最后是右孩子
{if (tree == NULL)                                //如果指向NULL则直接返回{return;}else{printf("%c->",tree->data);                 //先打印根的dataprintf_preTree(tree->Lchild);             //再使用遍历的方法对Lchild进行打印printf_preTree(tree->Rchild);               //如上打印Rchild}
}void printf_ioTree(Node* tree)                     //中序遍历,先是左孩子,然后就是根,再然后就是右孩子
{if (tree == NULL){return -1;}else{printf_preTree(tree->Lchild);               //先找到最左的孩子printf("%c->", tree->data);                   //然后打印dataprintf_preTree(tree->Rchild);              //再去打印根的孩子,最后会回到右孩子打印}
}void printf_lastTree(Node* tree)                   //尾序打印,先打印左孩子,再右孩子,最后就是根
{if (tree == NULL){return -1;}else{printf_lastTree(tree->Lchild);              //找到左边的孩子printf_lastTree(tree->Rchild);              //找到右边的孩子printf("%c->", tree->data);                    //打印右边的孩子}
}void main(void)
{Node* tree;int index = 0;char data[] = "AB##C##";creatTree(&tree,data,&index);printf_preTree(tree);printf("\n");printf_ioTree(tree);printf("\n");printf_lastTree(tree);printf("\n");return 0;
}

总结

上述如有错误地方,请指出,谢谢啦。

C语言二叉树的创建与遍历相关推荐

  1. C语言——二叉树的创建与遍历

    二叉树 内容 实现二叉树的创建算法与中序列遍历算法.步骤如下: 将二叉树模拟成完全二叉树,从根结点开始对所有结点进行编号,编号从1开始,在运行过程中输入结点对应的编号和值,最后以编号i=0,结点值x= ...

  2. 二叉树的创建和遍历-C语言实现

    二叉树的创建和遍历-C语言实现 链式存储结构 struct BinaryTreeNode {//数据char data;//左子树BinaryTreeNode *leftChild;//右子树Bina ...

  3. c语言二叉树的生成,C语言实现二叉树的创建以及遍历(递归)

    C语言实现二叉树的创建以及遍历 #include typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNo ...

  4. C语言二叉树曲折级顺序遍历(附完整源码)

    C语言二叉树曲折级顺序遍历 曲折级顺序遍历 C语言二叉树曲折级顺序遍历完整源码(定义,实现,main函数测试) 曲折级顺序遍历 Given a binary Tree 1/ \2 3/ \ / \4 ...

  5. C语言二叉树的逆向有序遍历(附完整源码)

    C语言二叉树的逆向有序遍历 C语言二叉树的逆向有序遍历完整源码(定义,实现,main函数测试) C语言二叉树的逆向有序遍历完整源码(定义,实现,main函数测试) #include <iostr ...

  6. python二叉树的创建与遍历

    二叉树的基本概念: 一个结点的层次直观上来说就是其所在的行,其中根结点层次为1(第一行),其子结点层次为2(第二行),以此类推 二叉树的深度(高度):指的是二叉树中的最大叶子结点所在的层.二叉树的深度 ...

  7. c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理

    C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...

  8. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  9. [******] 树问题:普通二叉树的创建与遍历

    1. 二叉树的创建 String pre_str = "1,2,4,8,-1,-1,9,-1,-1,5,-1,-1,3,6,-1,10,-1,-1,7,-1,-1";//先序输入S ...

最新文章

  1. 二级考试java模拟考试_2017年计算机二级考试Java模拟试题及答案
  2. 【最大流】牛棚安排(jzoj 1259)
  3. qt中记录数据的一次接收处理方法
  4. 使用 Visual Studio 发布 .NET 控制台应用程序
  5. SEGGER RTT使用总结
  6. 汽车软件行业工程师详细介绍?(中)
  7. 【解决方法】域名指向本地(127.0.0.1, 0.0.0.0)
  8. 亚马逊云科技赋能全新基于云的安全SaaS平台——安智联365
  9. 倒谱基音周期matlab,Matlab基于倒谱和EMD的语音基音周期的提取.doc
  10. 入门android开发
  11. wx python 基本控件
  12. golang语言的入门基础,及window和linux系统上环境的搭配及运行
  13. 流利说AI刘扬:从教授到”AI虚拟老师“
  14. Robotstudio软件:工作站中多台机器人I/O通信仿真实现
  15. 如何用AVS Video Editor这款视频编辑软件消除音频噪音?
  16. overleaf表格_Overleaf——LaTeX制表命令使用教程
  17. VC++图片类型的识别(附源码)
  18. vue中的data为什么是一个函数?起到什么作用?
  19. 【MySQL】过年没有回老家,在出租屋里整理了一些思维导图
  20. 工业继电器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. 创建一个Python脚本,实现以下功能。(1)定义一个元组t1=(1,2,R,py,Matlab‘)和一个空列表1ist1。(2)以while循环的方式,用append()函数依次向listl中
  2. html下拉框显示多个,多选下拉框 js多值切换显示
  3. Eclipse 配置主题及处理四周白色框问题
  4. 数字人民币对公钱包、商户、收款码之间是什么关系(附商户接入案例)
  5. 半闲居士视觉SLAM十四讲笔记(1)前言
  6. MyBatis 如何防止SQL注入 —— 底层原理
  7. 重置 Amazon EC2 实例的密码和SSH 密钥
  8. 库卡机器人外部紧急关断已按_东莞市库卡机器人系统维修中心
  9. C++程序设计案例实训教程第2章(qq讨论群112133686)
  10. MySQL5.7.26错误问题 mysqld.exe: Error while setting value ‘STRICT_TRANS_TABLES, ...‘ to ‘sql_mode‘