基本概念(n个节点,n-1条边)

1.    树的层次:根节点为第一层,简单的就看垂直有多少节点就行。深度就是最大层数

2.    路径长度:根节点到某个节点的边的个数。

3.    具有n个节点的m叉树的最小高度为: + 1

4.      高度为h的m叉树至多有- 1)/(m –1)个节点

二叉树

二叉树可以是空树,并且二叉树是有序树。注意二叉树和度为2的有序树的差别

二叉树和度为2的有序树的差别:

1. 二叉树可以为空,度为2的有序树至少有3个节点

2. 二叉树节点的顺序不是相对于另一个节点而言,但是有序树是这样的。如果一个节点只有一个子节点,有序树不区分其左右次序;二叉树则区分是左子树还是右子树。

几个特殊的二叉树:

1.      满二叉树:若树高为h,则一定有-1个节点。树中除去最后一层的节点,每一个节点的度均为2.且叶子节点只能出现在最后一层。

2.    完全二叉树:一个高度为h,有n个节点,节点的顺序和满二叉树完全一样,则是一个完全二叉树。它的叶子节点只可能出现在最后两层。并且所有叶子节点都从最左边依次排列。整个完全二叉树如果有,只可能有一个度为1的节点,并且该节点没有右孩子。如果n为奇数,则没有度为1的节点,若n为偶数则编号为n/2的节点度为1。

3.    二叉排序树:可以为空树。左子树的所有节点小于根节点,有子树的所有节点大于根节点。并且左右子树分别也是一棵二叉排序树。

4.    平衡二叉树:是一棵二叉排序树,并且树上任一个节点的左右子树深度之差不大于1.

二叉线索树

因为n个节点会有n+1个空指针域,所以二叉线索树就用上这些空指针域。用左边的指向其前驱节点,后边的指向其后驱节点。对于遍历二叉线索树,前序和中序都可以根据自己的前后继找到相应的节点,但是后序二叉线索树遍历必须借助栈来辅助才能完成,但是不是所有的树都的后序都需要借助栈,只有左半边或右半边的是不用的。

l  前序:对于p节点的后继,如果有左节点就直接是左节点,没有左节点就去找有节点,都没有就去找右线索即可

l  中序:对于p节点的后继,如果有右线索直接就是右线索,如果没有,那就去找右子树的最左下节点。

l  后序:对于p的后序节点有三种情况。如果该节点为根节点,后继为空;如果为双亲节点的右节点或者是左孩子但是其双亲没有右孩子,那么后继为双亲节点;节点是双亲节点的左孩子且其双亲节点有右孩子,那么后继是双亲节点右子树上按照后序遍历的第一个节点。

l  对于拥有左右节点的二叉树而言,前序和后序索引都会有1个空闲指针,中序则会有2个空闲指针。

二叉排序树(BST)

二叉排序树可以为空树

是一种动态集合,树的结构不是一次生成的,是在查找过程中,当没有找到关键字等于给定点,就插入给定点,所以新插入的节点一定是叶节点。

l   二叉排序树的删除(3中情况):

1.    如果是叶子节点,直接删除即可

2.    如果节点只有一棵子树,就让其子树替代自己即可

3.    如果节点具有左右子树,那么令z的直接后继替代z即可。

l   查找效率分析:

最好情况就是一次找到,也就是O(1);最差情况是,输入的序列为一个有序序列,所以构造出来的BST是一棵倾斜的树,那么平均查找长度就和单链表一样了,O(n)。

BST的平均查找长度主要取决于树的高度。最好的情况就是BST的左右子树高度之差不超过1(即是一棵AVL),此时的平均查找长度为O(),查找过程和折半查找相似。

折半查找的判定树是唯一的,但是二叉排序树是不唯一的。

平均时间为O),但对象是有序表时,平均时间为O(n)

平衡二叉树(AVL)

可以为一棵空树。平衡二叉树的平均查找时间为O

平衡因子bf:结点的左子树高度减去右子树高度。只能为0, 1,-1三者之一

l   AVL的插入:

因为结点的插入可能会导致某个结点失去平衡,所以需要再每一次插入之后进行调整。每次调整的对象都是最小的不平衡子树,也就是在离插入结点最近的平衡因子绝对值大于1的结点作为根的子树。一般会有四种情况:LL、RR、LR、RL。后两者需要选装两次。

1.    LL:插入A的左孩子的左节点,导致A的平衡因子变为2.

2.    RR:插入A的右孩子的右结点,导致A的平衡因子变为-2

3.    LR:插入A的左孩子的右子树上,导致A的平衡因子变为2。此时需要旋转两次。先将以A的左孩子为根节点的子树进行RR旋转,然后将以A为根的子树进行LL旋转

4.    RL:插入A的右孩子的左子树上,导致A的平衡因子变为-2。此时需要选装两次。先将以A的右孩子为根节点的子树进行LL旋转,然后将以A为根的子树进行RR旋转。

l   AVL的查找:

用表示高度为h的AVL中含有最少结点数,则++1;当AVL中除去叶子结点以外,所有结点的bf=1时,满足具有最少结点数的条件。

平衡二叉树的平均查找时间为O()

哈夫曼树

带权路径长度(WPL):结点的权值乘以路径长度(边数)。对于树的带权路径长度定义为,所有叶结点的带权路径长度之和。

哈夫曼树:又称最优树。在含有N个带权叶子结点的树,其中WPL最小的二叉树。

 

树、森林

l  树:这里用二叉链表存储。左孩子右兄弟。给定一棵树,有唯一的二叉树与之对应。

l   树转二叉树:每个结点中的左指针指向第一个孩子结点,右指针指向它在树中的相邻兄弟结点。T中非叶节点数为n的话,BT中没有右孩子的结点数为n+1。因为根节点没有兄弟,所有BT一定没有右子树。

l   森林转二叉树:先把森林中所有树转为二叉树,然后让第一棵树的根节点为BT的根节点,第一棵树的左子树为BT的左子树。第二棵树充当根节点的右子树。第三棵树充当根节点右孩子的右子树,以此类推。如果森林中有叶子节点n个,因为叶子节点没有孩子节点,所以BT中该节点就没有左孩子。因此F中的叶结点个数就等于BT中左孩子指针为空的个数。然后BT中右孩子为空的结点个数等于F中非叶节点个数+1.在森林转换为二叉树的过程中,如果u的是结点v的父结点的父结点,那么u和v的关系即可能是父子也可能是兄弟。父子:v是u的第二个孩子;兄弟:v和u中间加一个别的兄弟就行。

l   二叉树转森林:二叉树根及其左子树当做一棵树,右子树可以看做是一棵新的需要转换为森林的二叉树,重复进行,直到最后产生一棵没有右子树的二叉树为止。

l   树的先根遍历:若树非空,先访问根结点,再按照从左到右的顺序遍历根结点的每一棵子树。其访问顺序与这棵树相应二叉树的先序遍历顺序相同。

l   后根遍历:若树非空,按照从左到右的顺序遍历根结点的每一棵子树,之后再访问根结点。其访问顺序与对应二叉树的中序遍历相同。

l   森林的先序遍历:访问森林中第一棵树的根结点,先序遍历第一课树中根结点的子树森林,先序遍历除去第一棵树之后剩余的树构成的森林。顺序对应二叉树的先序

l   中序遍历森林:中序遍历森林中第一棵树的根结点的子树森林,访问第一棵树的根结点,中序遍历除去第一棵树之后剩余的树构成的森林。对应二叉树的中序遍历

森林

二叉树

先序遍历

先根遍历

先序遍历

中序遍历

后根遍历

中序遍历

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值