树和二叉树

注:本文内容来自电子工业出版社《软件设计师考试辅导教程》2015年3月第1版

1.1 树
1.1.1树的基本概念
树是由一个或多个节点组成的有限集合T,它满足如下两个条件:
1)有一个特定的结点,称为根节点
2)其余的节点分成m(m>=0)个互不相交的有限集合。其中每个集合又都是一棵树,称T1,T2,…,Tm-1为根结点的子树。
这里写图片描述

上图为树结构示意图,由上图可知:
1.一棵树由子树构成,子树又由更小的子树构成。
2.由条件1)可知,一棵树至少有一个结点(根结点)。=》上图根结点为1
3.一个结点的子树数目称为该结点的度(次数),树中各结点的度的最大值称为树的度(树的次数)=》结点1的度为3,结点2的度为4,该树的度数为4
4.度为0的结点称为叶子结点(树叶),除叶子结点外的所有节点称为分支结点,根以外的分支结点称为内部结点

在用图形表示的树中,对两个用线段连接的相关联的结点而言:

  • 双亲节点:位于上端的结点
  • 子节点:位于下端的结点
  • 兄弟结点:同一父结点的多个子节点
  • 堂兄弟结点:处于同一层次上,不同父节点的子节点

定义一颗树的根结点所在的层次为1,其他结点所在的层次等于它的父结点所在的层次+1。树种各结点的层次的最大值称为树的层次。

1.1.2 树的常用存储结构
因为树是非线性的,为了存储树,必须要把树中结点之间的关系反应在存储结构中
1)标准存储结构:树种的结点内容可分为两部分,结点的数据和指向结点的指针数据。对于N度树,在其标准存储结构中指针数组有N个元素
2)带逆存储结构:在标准存储结构的基础上增加一个指向其父结点的指针
1.1.3 树的遍历(重点)
前序遍历:首先访问根结点,然后从左到右按前序遍历根结点的各棵子树
后序遍历:首先从左到右按后序遍历根结点的各棵子树,然后访问根结点
层次遍历:首先访问处于0层上的根节点,然后从左到右依次访问处于1层上的结点,再从左到右依次访问处于2层上的结点等,即自上而下,从左到右逐层访问树中的各层上的结点。
以此图为例:
这里写图片描述
前序遍历:1,2,5,6,7,8,3,4,9,a,b
后序遍历:5,6,7,8,2,3,a,b,9,4,1
层次遍历:1,2,3,4,5,6,7,8,9,a,b

*1.2 二叉树 BinaryTree*
1.2.1 二叉树的基本概念
二叉树是一个有限的结点集合,该集合或者为空,或者由一个根结点及两棵互不相交的左,右二叉子树所组成。二叉树的结点中有两棵子二叉树,分别称为左子树和右子树。因为二叉树可以为空,所以二叉树中的结点可能没有子结点,也可能只有一个左子结点or右子结点,也可能同时有左右两个子节点。下图所示为二叉树的4种不同形态,如果算上空二叉树,那么其实一共有五种形态。
这里写图片描述
二叉树常采用类似树的标准存储结构来存储,C语言定义如下:

typedef struct Btnode{
char data; //数据
strucrt Btnode *lchild; //左孩子
struct Btnode *rchild; //右孩子
}BTNODE;


1.2.2 二叉树的性质
性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>=1)
性质2:深度为k的二叉树至多有2^k-1个结点(k>=1)
性质3:对任何一棵二叉树,如果其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1
一棵深度为k且有2^k-1(k>=1)个结点的二叉树称为满二叉树。
这里写图片描述
上图所示即为一棵满二叉树
由上图可以看到:第三层上最多有2^(3-1)=4个结点,深度为3的它至多有2^3-1=7个结点,现在它的叶子结点数为4,度数为2的结点数为3(1,2,3),所以4=3+1

如果深度为k,有n个结点的二叉树中各结点能够与深度为k的顺序编号的满二叉树从1到n标号的结点对应,则称这样的二叉树为完全二叉树。
所以下图中,最左边的是完全二叉树,其余两棵都是非完全二叉树。
这里写图片描述
根据完全二叉树的定义,在一颗完全二叉树中,所有的叶子结点都出现在第k层或k-1层(最后两层)

性质4:具有n(n>0)个结点的完全二叉树的深度为这里写图片描述(注:这里写图片描述符号为向下取整运算符,这里写图片描述符号为向上取整运算符,这里写图片描述表示不大于3.9的最大整数,即3,这里写图片描述表示不小于3.9的最大整数,即4)

性质5:如果对一棵树有n个结点的完全二叉树的结点按层序编号(从第一层到第第层,每层从左到右),则对任一结点i(1<=i<=n),有:

  • 如果i=1,则结点i无双亲,是二叉树的根;如果i>1,则其双亲是结点这里写图片描述
  • 如果2i>n,则结点i为叶子结点,无左孩子;否则,其左孩子是结点2i
  • 如果2i+1>n,则结点I无右孩子;否则,其右孩子是结点2i+1

1.2.3 二叉树的遍历

  • 前序遍历:首先访问根结点,然后按前序遍历根结点的左子树,再按前序遍历根结点的右子树
  • 中序遍历:首先按中序遍历根结点的左子树,然后访问根结点,再按中序遍历根结点的右子树
  • 后序遍历:首先按照后序遍历根结点的左子树,然后按后序遍历根节点的右子树,再访问根结点;
    这里写图片描述
    例如:上图所示的二叉树,它的前序遍历,中序遍历和后序遍历结果分别如下:
  • 前序遍历:1,2,4,5,7,8,3,6
  • 中序遍历:4,2,7,8,5,1,3,6 先左子->根->右子
  • 后序遍历:4,8,7,5,2,6,3,1

性质6:一棵二叉树的前序序列和中序序列可以唯一地确认这棵二叉树

例如:某二叉树的前序序列为ABHFDECKG,中序序列为HBDFAEKCG,则构造二叉树的过程:
前序序列确定A为根结点,中序序列把A左右分开
这里写图片描述
根据前序序列的定义,确定B是A的左边子结点,取B,将B的子结点分为H和FD两个
这里写图片描述
取出D
这里写图片描述
至此左子树完毕,我们杀入右子树
取E
这里写图片描述
观察前序序列并结合中序序列,取出C
这里写图片描述
取K和G的过程省略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值