博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的遍历
阅读量:2432 次
发布时间:2019-05-10

本文共 1850 字,大约阅读时间需要 6 分钟。

二叉树的定义

二叉树是个结点的有限集合,该集合或者空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的坐子树和右子树的二叉树组成。

二叉树特点

每个节点最多有两棵树,所以二叉树中不存在度大于2的结点。

左子树和右子树是有顺序的,次序不能任意颠倒。
即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

二叉树的五种形式

1.空二叉树

2.只有一个根节点3.根节点只有左子树
4.根节点只有右子树5.根节点既有左子树也有右子树。

特殊二叉树

1斜树

每一层只有一个结点,结点的个数与二叉树的深度相同。

所有的结点都只有左子树的二叉树叫做左斜树,所有的结点只有右子树的二叉树叫做右斜树。

2满二叉树

在一个二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有的叶子都在同一层,这样的二叉树称为满二叉树。

满二叉树的特点:
叶子只能出现在最下一层
非叶子节点的度一定是2,。
在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。

3.完全二叉树

对于一颗具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点。

满二叉树一定是完全二叉树。但完全二叉树不一定会是满的。
完全二叉树的特点
1.叶子节点只能出现在最下两层
2.最下层的叶子节点一定集中在左部连续位置
3.倒数二层,若有叶子节点,一定都在右部连续位置。
4.如果结点的读为1,则该结点只有左孩子,即不存在只有右子树的位置。
5.同样结点数的二叉树,完全二叉树的深度最小。
判断某二叉树是否是完全二叉树的办法,那就是看着树的示意图,心中默默的给每个节点按照满二叉树的结构逐层顺序编号,如果编号出现空档,就说明不是完全二叉树,负责就是。

二叉树的性质

性质1:在二叉树的第i层上至多有2的n-1次方个结点*(n>=1)

性质2:深度为k的二叉树至多有2的k次方-1个结点(k>=1).
性质3:对任何一棵二叉树T,如果其终端结点数位n0,度为2的结点数为n2.则n0=n2+1;
性质4:具有n个结点的完全二叉树的深度为[log2n]+1([x]表示不大于x的最大整数)。
性质5:如果对一棵树有n结点的完全二叉树(其深度为[log2n]+1)的结点按层编号(从第一层到第[log2n]+1层,每层从左到右),对任一结点i(1<=i<=n)有:
1.如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点[i/2].
2.如果2i>n,则结点i无左孩子(结点i为叶子节点);否则其左孩子是结点2i.
3.如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1.

二叉树的顺序存储结构

二叉树的顺序存储结构就是一维数组存储二叉树的结点。

二叉链表

二叉树的每个节点最多有两个孩子,所以为它设计一个数据域和两个指针域,我们称这样的链表叫做二叉链表。

lchild data rchild
data是数据域、lchild和rchild都是指针域

typedef struct BitNode{    TElemType data;    struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;

二叉树的遍历是指从根结点出发,按照某种相同的次序依次访问二叉树种所有的结点,使得每个结点被访问一次且仅被访问一次。

二叉树遍历方法

前序遍历

若二叉树为空,则返回操作空,否则先访问根节点,然后遍历左子树,再前序遍历右子树。如图遍历顺序

ABDGHCEIF
这里写图片描述

中序遍历

若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点,最后访问中序遍历右子树。GDHBAEICF

这里写图片描述

后序遍历

若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左、右子树,最后访问根结点。顺序为GHDBIEFCA

这里写图片描述

层序遍历

若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。遍历的顺序为:ABCDEFGHI

这里写图片描述

性质:

已知前序遍历序列和中序遍历序列,可以唯一确定一棵二叉树
已知后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树
已知前序遍历和后续遍历,不能确定一棵二叉树。

你可能感兴趣的文章
Linux命令英文解释(按英文字母顺序)
查看>>
秋招面试准备-数据库知识
查看>>
数据分析岗-机器学习相关知识
查看>>
分类模型的效果评估
查看>>
深入理解什么是Java双亲委派模型
查看>>
MySQL优化Limit查询语句
查看>>
轻松入门MySQL主从复制原理
查看>>
SpringCloud全家桶---Zuul网关
查看>>
基于zuul和ribbon的灰度发布方案
查看>>
JVM常用垃圾收集器参数说明
查看>>
MySQL索引基础知识梳理
查看>>
MySQL事务ACID底层实现原理
查看>>
关于MySQL wait_timeout问题记录
查看>>
基础算法面试题---如何用栈实现队列
查看>>
基础算法面试题---如何用队列实现栈(1)
查看>>
基础算法面试题---如何用队列实现栈(2)
查看>>
基础算法面试题---如何数组实现栈和队列
查看>>
API接口安全性设计以及各参数的作用
查看>>
《Netty权威指南 第2版》学习笔记(1)---服务端与客户端开发入门
查看>>
《Netty权威指南 第2版》学习笔记(6)--- HTTP协议开发应用
查看>>