二叉树结合了两种数据结构的优点:
a.有序数组,可快速查找数据项,(插入和删除慢)
b.链表,快速插入和删除数据项,(查找慢)
树
树由边连接的节点构成,是范畴更广的图的特例。
路径、根、父节点、子节点、叶节点、子树、访问、遍历、层、关键字、
二叉树
每个节点最多有两个子节点。
二叉树的性质
性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)
性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:包含n个结点的二叉树的高度至少为(log2n)+1
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
满二叉树
定义:高度为h,并且由2h-1个结点组成的二叉树,称为满二叉树
完全二叉树
定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下层的叶结点集中在靠左的若干位置上,这样的二叉树称为完全二叉树。
特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
二叉搜索树
一个节点的左节点的关键字值小于这个节点,右子节点的关键字值大于或等于这个节点。
非平衡树
大部分的节点在根的一边或另一边。
不平衡是数据项插入顺序造成的,随机插入树会相对平衡一点。
树的操作
查找、插入、遍历、删除节点
遍历:前序、中序、后序遍历
节点访问的前、中、后顺序来命名
1.前序:该节点、左子树 、右子树
2.中序:左子树、该节点、右子树
3.后序:左子树、右子树、该节点
例子:
前序遍历:ABCDEFGHK
中序遍历:BDCAEHGKF
后序遍历:DCBHKGFEA
删除节点(复杂操作)
情况1:删除没有子节点的节点
只需改变该节点的父节点的对应子字段的值,由指向该节点改为null
情况2:删除有一个子节点的节点
剪断该节点,把它的子节点直接连接到它的父节点上,指向要删除节点的子节点
情况3:删除有两个子节点的节点
用它的中序后继来代替该节点。
中序后继:比该节点的关键字值次高的节点。
树的效率
O(logN),精确来说是O(log2N)
用数组表示树
大多数情况下不是很有效率
节点n
该节点的左子节点:2*n+1
该节点的右子节点:2*n+2
父节点:(n-1)/2
重复关键字