二叉树原理详解

一、 树的相关名词

根节点——一棵树最上方的结点
结点的度——结点拥有的子树的数目(eg上图B的度为1)。
叶子结点——度为0的结点(不为0的称为分支结点)。
树的度——树中结点的最大的度
层次——根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1
树的高度——树中结点的最大层次
森林——0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。

二、二叉树
二叉树是每个结点的度不大于2的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
在这里插入图片描述(图片来源:https://blog.csdn.net/xiaoquantouer/article/details/65631708)

二叉树6条的重要性质:

1、在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1(证一下:总度数n=n0+n1+n2 (因为有0,1,2三类结点),又有n=n00+n11+n2*2+1(这是利用度之间关系,可以找个简单二叉树的图验证理解一下)两个式子划等号就有结果了。)
2、二叉树第i层上的结点数目最多为2i-1(i>=1)
3、深度为k的二叉树至多有2
k-1个结点(k>=1)
4、若二叉树按照从上到下从左到右依次编号,则若某节点编号为k,则其左右子树根节点编号分别为2k和2k+1
5、包含n个结点的二叉树的高度至少为(log2n)+1(不要漏了加1,利用特殊特殊例子记忆:只有一个结点,高度为1)。
6、在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]+1是向下取整

三、3种重要的二叉树
1、满二叉树
定义:高度为h,并且由2h-1个结点组成的二叉树,称为满二叉树
在这里插入图片描述
(图片来源:https://blog.csdn.net/xiaoquantouer/article/details/65631708)

2、完全二叉树
定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下层的叶结点集中在靠左的若干位置上,这样的二叉树称为完全二叉树。
在这里插入图片描述
(图片来源:https://blog.csdn.net/xiaoquantouer/article/details/65631708)

3、二叉查找树
定义:二叉查找树又被称为二叉搜索树。设x为二叉查找树中的一个结点,x结点包含关键字key,结点x的key值计为key[x]。如果y是x的左子树中的一个结点,则key[y]<=key[x];如果y是x的右子树的一个结点,则key[y]>=key[x]

四、二叉树的实现方式

1.第一类数组实现——空间浪费
用数组root[]存储结点值。
在这种实现当中,对于编号为k的节点,其左子节点的编号为2k,右子节点的编号为2k + 1,根节点的编号为1。这种实现易产生巨大的空间浪费,比如对于一个只有一条链的树,假设该树含有31个节点,存储这31个节点却需要开一个2^30的数组,因此该方法较少使用。

2.结构体+指针实现——节省空间
用结构体指针p来表示一个节点,其中p->v表示该节点的权值,p->left和p->right分别指向该节点的左右子节点,初始化全部为NULL.
若需用到该节点,则申请空间,否则视为无子节点!就这样互相联系成一颗结构体指针二叉树!节省空间,但是容易出现指针悬挂或者未知的指针内存错误。

3.第二类数组实现
对于一棵有n个节点树,只需要开一个大小为n的数组,节点按照出现顺序依次编号,这么一来,每个节点的左右节点的编号就无法通过2k,2k+1的形式来直接确定了。
这时就需要数组lch[maxn] , rch[maxn];其中lch[u]表示p节点的左子节点的编号,因此通过p = lch[p]就可以访问到p节点的左子节点,rch[p]的含义同理。
另外,用value[p]表示编号为p节点的权值,如此一来,申请新节点的newnode函数与初始化的newtree函数写法就变得不同了。

五、二叉树的三种遍历方式

1、 先序遍历:按照根节点->左子树->右子树的顺序访问二叉树
2、 中序遍历:按照左子树->根节点->右子树的顺序访问二叉树
3、 后序遍历:按照左子树->右子树–>根节点的顺序访问二叉树

参考:
https://blog.csdn.net/xiaoquantouer/article/details/65631708
https://blog.csdn.net/qq_40772692/article/details/79343914

(`・ω・´)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值