二叉树相关总结

本总结大量参考网上的内容,并结合自身经验进行分析,若存在偏差和请各位前辈指正。
本文主要从二叉树基础、二叉搜索树以及二叉排序树三个点进行总结。
**

二叉树特点

**
1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
2)左子树和右子树是有顺序的,次序不能任意颠倒。
3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

二叉树性质

1)在二叉树的第i层上最多有2i-1 个节点 。(i>=1)
2)二叉树中如果深度为k,那么最多有2k-1个节点。(k>=1)
3)n0=n2+1 n0表示度数为0的节点数,n2表示度数为2的节点数。
4)在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]是向下取整。
5)若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点有如下特性:
(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。
斜树:所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。

满二叉树

在一棵二叉树中。如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
满二叉树的特点有:
1)叶子只能出现在最下一层。出现在其它层就不可能达成平衡。
2)非叶子结点的度一定是2。
3)在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。
完全二叉树:对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。

特点:
1)叶子结点只能出现在最下层和次下层。
2)最下层的叶子结点集中在树的左部。
3)倒数第二层若存在叶子结点,一定在右部连续位置。
4)如果结点度为1,则该结点只有左孩子,即没有右子树。
5)同样结点数目的二叉树,完全二叉树深度最小。
注:满二叉树一定是完全二叉树,但反过来不一定成立。

计算节点数

(度:节点下的叶子数)
度2=度0-1
总节点=度2+度0+度1

二叉树的遍历

前序遍历:从根节点开始,若遍历完就上一层,走的每一个节点都要展示
中序遍历:直接到左的最后,然后再逐步返回,走的每一个节点都要展示
后序遍历:直接到左的最后,再找兄弟节点,再向上,再找兄弟节点(此点不展示)的最下,依次。
层序遍历:一层一层向下
二叉树重构(已知前序遍历序列和后序遍历序列,不可以唯一确定一棵二叉树。)
已知前序,中序
1根据前序第一个节点将中序两个子树分离
2回到前序,将左右子树的节点分开
3从第一个节点(左组)将中序分离
下同。
要点:根由前序分组的第一个决定;中序确定分组
已知中序后序
1根据后序最后一个节点将中序两个子树分离
2再回到后序的从最后一个节点获取两个子树的根节点
3下同
要点:根由后序分组的最后一个决定;中序确定分组

二叉树的存储结构

①顺序存储:使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索 引。
要点:当二叉树为完全二叉树时,结点数刚好填满数组
那么当二叉树不为完全二叉树时,出现空间浪费
对于右斜树极端情况,采用顺序存储的方式是十分浪费空间的。
顺序存储一般适用于完全二叉树
②二叉链表:由二叉树定义可知,二叉树的每个结点最多有两个孩子。因此,可以将结点数据结构定义为一个数据和两个指针域。

二叉搜索树

一棵结点数目为n的二叉树,采用二叉链表的形式存储。
结点为n的二叉树一共有n-1条有效分支路径。那么,则二叉链表中存在2n-(n-1)=n+1个空指针域。为避免节点
线索化
现将某结点的空指针域指向该结点的前驱后继。
若结点的左子树为空,则该结点的左孩子指针指向其前驱结点。
若结点的右子树为空,则该结点的右孩子指针指向其后继结点。
指向前驱和后继的指针称为线索。将一棵普通二叉树以某种次序遍历,并添加线索的过程称为线索化。
通过线索化,既解决了空间浪费问题,又解决了前驱后继的记录问题。
如何区分一个结点的lchild指针是指向左孩子还是前驱结点
添加标志位ltag,rtag:
①ltag为0时,指向左孩子,为1时指向前驱
②rtag为0时,指向右孩子,为1时指向后继
总结:线索二叉树充分利用了指针空间,同时又便于寻找结点的前驱结点和后继结点。线索二叉树适用于经常需要遍历寻找结点前驱或者后继结点的二叉树。

二叉排序树

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),也称二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;

数据结构中,线性表分为无序线性表和有序线性表。
无序线性表的数据是杂乱无序的,所以在插入和删除时,没有什么必须遵守的规则,可以插入在数据尾部或者删除在数据尾部。但是在查找的时候,需要遍历整个数据表,导致无序线性表的查找效率低。
有序线性表的数据则相反,查找数据时的时候因为数据是有序的,可以用二分法、插值法、斐波那契查找法来实现。但是,当进行插入和删除操作时,需要维护表中数据的有序性,会耗费大量的时间。

构造二叉排序树
先排序,再将序列的中点作为根节点,
剩下的两组分别中点,取大的放右,小的放左。

二叉排序树查找
由二叉树的递归定义性质,建立以下设计思路递归进行查找:
如果树是空的,则查找结束,无匹配。
如果被查找的值和根结点的值相等,查找成功。否则就在子树中继续查找。如果被查找的值小于根结点的值就选择左子树,大于根结点的值就选择右子树。

二叉排序树插入
二叉排序的插入是建立在二叉排序的查找之上的,插入一个结点,就是通过查找发现该结点合适插入位置,把结点直接放进去。由此可以得出二叉排序树插入按以下递归进行查找:
若查找的key已经有在树中,则p指向该数据结点。
若查找的key没有在树中,则p指向查找路径上最后一个结点。

二叉排序树删除
由于删除可能会导致树的整体结构发生变化,因此进行分情况考虑:
(1)删除结点为叶子结点;
(2)删除的结点只有左子树;
(3)删除的结点只有右子树;
(4)删除的结点既有左子树又有右子树;
①删除结点为叶子结点:因为不涉及其他节点的位置,不影响其他节点的顺序变化。所以直接删除即可;
②删除的结点只有左子树;直接删除掉本节点,并将左子树上移即可;
③删除的结点只有右子树:同上;
④删除的结点既有左子树又有右子树;需要将剩下的树进行重新排序,并找出和待删除节点差值最小的节点直接替代该点位置即可。
删除前需要查找相应的点确定其相关属性,若不存在即刻返回。

相关总结主要参考简书作者:MrHorse1992以及网上的其他内容。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值