二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。

一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为log2n+1。深度为k的完全二叉树,至少有2^(k-1)个节点,至多有2^k-1个节点。

-摘自百科

二叉树的其它的特性我就不多做介绍了,详情请大家自行搜索!

此处着重介绍二叉树的遍历,二叉树的遍历存在四种方式:

先序遍历:访问根节点->遍历左子树->遍历右子树

中序遍历:遍历左子树->访问根节点->遍历右子树

后序遍历:遍历左子树->遍历右子树->访问根节点

如上图所示的二叉树

采用先序遍历的结果为:ABDHIEJCFKG

采用中序遍历的结果为:HDIBEJAFKCG

采用后序遍历的结果为:HIDJEBKFGCA

下面首先通过C语言简单实现二叉树的初始化创建和先序遍历的方式输出每个节点所在树的层次:

//
// Created by Administrator on 2018/6/5.
//#include "stdio.h"
#include "stdlib.h"/*** 创建一棵二叉树并输出每个节点所在二叉树的层次* 输入方式:ABDH##I##E#J##CF#K##G##*/#define ElementType char
typedef struct {ElementType data;struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;/*** 创建一棵二叉树:先序遍历的方式* @param tree* @return 二叉树*/
BitTree createBitTree(BitTree tree) {char c;scanf("%c", &c);if ('#' == c) {return 0;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createBitTree(tree->lchild);tree->rchild = createBitTree(tree->rchild);}return tree;
}/*** 打印结果* @param data 节点元素* @param level 所在层数*/
void printLevel(char data, int level) {printf("%c 在第 %d 层\n", data, level);
}/*** 先序遍历* @param tree* @param level*/
void preOrder(BitTree tree, int level) {if (tree) {printLevel(tree->data, level);preOrder(tree->lchild, level + 1);preOrder(tree->rchild, level + 1);}
}int main() {int level = 1;BitTree tree;tree = createBitTree(tree);printf("先序遍历结果:\n");preOrder(tree, level);return 0;
}

接下来实现二叉树的三种遍历方式:

//
// Created by Administrator on 2018/6/5.
//
/*** 二叉树的三种遍历方式:先序遍历、中序遍历、后序遍历*/
#include "stdio.h"
#include "stdlib.h"#define ElementType char
typedef struct {ElementType data;struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;/*** 创建一棵二叉树:通过先序遍历的方式创建* @param tree* @return 二叉树*/
BitTree createBitTree(BitTree tree) {char c;scanf("%c", &c);if ('#' == c) {return 0;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createBitTree(tree->lchild);tree->rchild = createBitTree(tree->rchild);}return tree;
}/*** 访问节点* @param data 节点数据*/
void visit(char data) {printf("%c", data);
}/*** 先序遍历* @param tree*/
void preOrder(BitTree tree) {if (tree) {visit(tree->data);preOrder(tree->lchild);preOrder(tree->rchild);}
}/*** 中序遍历* @param tree*/
void inOrder(BitTree tree) {if (tree) {inOrder(tree->lchild);visit(tree->data);inOrder(tree->rchild);}
}/*** 后序遍历* @param tree*/
void postOrder(BitTree tree) {if (tree) {postOrder(tree->lchild);postOrder(tree->rchild);visit(tree->data);}
}int main() {BitTree tree;tree = createBitTree(tree);printf("先序遍历结果:");preOrder(tree);printf("\n");printf("中序遍历结果:");inOrder(tree);printf("\n");printf("后序遍历结果:");postOrder(tree);printf("\n");return 0;
}

好了,以上就是二叉树的集中遍历方式,如果有小伙伴有疑问的可以关注公众号,我们在群里面一起探讨交流哦!

数据结构-二叉树的遍历相关推荐

  1. 数据结构——二叉树的遍历

    "树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点 ...

  2. 数据结构-二叉树层次遍历

    首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...

  3. java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)

    二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...

  4. 数据结构 - 二叉树的遍历

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 二叉树的遍历 N:访问根结点,L:遍历根结点的左子树 ...

  5. 第五期 C/C++数据结构 二叉树的遍历以及结点数、深度

    代码详见后面 实验三 树和二叉树 一.实验目的 1.使学生熟练掌握二叉树的逻辑结构和存储结构(重点). 2.熟练掌握二叉树的各种遍历算法(难点). 二.实验原理及说明 1. 前序遍历算法思想: (1) ...

  6. Java数据结构——二叉树的遍历

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...

  7. 数据结构 二叉树的遍历

    所谓遍历, 无非就是把1个容器的所有元素逐个输出, 而这个输出是线性的. 但是二叉树是1个非线性的容器,  如何把它的元素按一定顺序输出就是1个值得学习的课题了. 一般来讲, 遍历二叉树有3种方法, ...

  8. 02331 数据结构 二叉树的遍历

    算法思想 按一定规则和顺序走遍二叉树的所有结点,使每一个节点都被访问一次,且只被访问一次. (1)先序遍历[根->左->右] 1. 访问根节点2. 遍历左孩子3. 遍历有孩子 (2)中序遍 ...

  9. 二叉树的遍历实验报告C语言,数据结构-二叉树的遍历(类C语言描写叙述)

    遍历概念 所谓遍历(Traversal)是指沿着某条搜索路线.依次对树中每一个结点均做一次且仅做一次訪问.訪问结点所做的操作依赖于详细的应用问题. 遍历是二叉树上最重要的运算之中的一个,是二叉树上进行 ...

最新文章

  1. 谈谈对数据库中ACID、CAP、BASE的认识
  2. webpack ,gulp
  3. Java09-day09【ArrayList(概述、构造方法、常用方法、遍历)、简易学生管理系统】
  4. 软件工程师必学的9件事
  5. mysql 查询语句 过滤_MySQL全面瓦解7:查询的过滤条件
  6. vue项目统一响应_Vue响应式原理及总结
  7. 视觉 Transformer 综述
  8. cmd 编码修改。 牛阿。 解决问题
  9. php 百度地图 云存储,jspopular3.0 | 百度地图API SDK
  10. 如何把MP4转为GIF格式
  11. Telegram、Telethon
  12. 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】倍增lca
  13. 程序员必备的几款文档编辑器
  14. 这些都是无轴螺旋输送机稳定运行的必要条件!
  15. vue cli3 使用vue-svg-loader 出现Invalid Component definition报错
  16. Python之strip详解
  17. PCB做板子步骤和经验
  18. 凸函数的判断(上): 重要的基本性质
  19. 【调剂】重庆理工大学2022年硕士研究生招生调剂公告
  20. 超牛逼的性能调优神器 — 火焰图

热门文章

  1. 服务器上的此文件夹中具有更多项目,清理或删除“可恢复的项目”文件夹中的项目...
  2. html5图片怎么顶格,iQOO 5系列几乎达到了“顶格”的性能状态。
  3. Ajax POST请求获取后台返回的数据
  4. 如何设计良好的viewcontroller
  5. CSS 实现 0.5px 边框线
  6. 自动化运维之部署Puppet
  7. 20145240 《Java程序设计》第四次实验报告
  8. python 多线程笔记(6)-- 闭包
  9. 在主界面的右下端设置系统时间
  10. 使用泛型实现单例提供者(原创翻译)