数据结构与算法之二叉树的基本概念和类型

1、二叉树的基本概念算法

二叉树:二叉树是每一个节点最多有两个子树的树结构。
根节点:一棵树最上面的节点称为根节点。
父节点子节点:若是一个节点下面链接多个节点,那么该节点称为父节点,它下面的节点称为子 节点。
叶子节点:没有任何子节点的节点称为叶子节点。
兄弟节点:具备相同父节点的节点互称为兄弟节点。
节点度:节点拥有的子树数。上图中,13的度为2,46的度为1,28的度为0。
树的深度:从根节点开始(其深度为0)自顶向下逐层累加的。上图中,13的深度是1,30的深度是2,28的深度是3。
树的高度:从叶子节点开始(其高度为0)自底向上逐层累加的。54的高度是2,根节点23的高度是3。
对于树中相同深度的每一个节点来讲,它们的高度不必定相同,这取决于每一个节点下面的叶子节点的深度。上图中,13和54的深度都是1,可是13的高度是1,54的高度是2。
2、二叉树的类型
类型 定义 图示
满二叉树
Full Binary Tree
除最后一层无任何子节点外,每一层上的全部节点都有两个子节点,最后一层都是叶子节点。知足下列性质:
1)一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;
2)叶子节点数(最后一层)为2k−1
3)第 i 层的节点数是:2i−1
4)总节点数是:2k1,且总节点数必定是奇数。
彻底二叉树
Complete Binary Tree
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层全部的结点都连续集中在最左边,这就是彻底二叉树。知足下列性质:
1)只容许最后一层有空缺结点且空缺在右边,即叶子节点只能在层次最大的两层上出现;
2)对任一节点,若是其右子树的深度为j,则其左子树的深度必为j或j+1。 即度为1的点只有1个或0个;
3)除最后一层,第 i 层的节点数是:2i−1
4)有n个节点的彻底二叉树,其深度为:log2n+1或为log2n+1
5)满二叉树必定是彻底二叉树,彻底二叉树不必定是满二叉树。
平衡二叉树
Balanced Binary Tree
又被称为AVL树,它是一颗空树或左右两个子树的高度差的绝对值不超过 1,而且左右两个子树都是一棵平衡二叉树。
二叉搜索树
Binary Search Tree
又称二叉查找树、二叉排序树(Binary Sort Tree)。它是一颗空树或是知足下列性质的二叉树:
1)若左子树不空,则左子树上全部节点的值均小于或等于它的根节点的值;
2)若右子树不空,则右子树上全部节点的值均大于或等于它的根节点的值;
3)左、右子树也分别为二叉排序树。
红黑树
Red Black Tree
是每一个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,知足下列性质:
1)节点是红色或黑色;
2)根节点是黑色;
3)全部叶子节点都是黑色;
4)每一个红色节点必须有两个黑色的子节点。(从每一个叶子到根的全部路径上不能有两个连续的红色节点。)
5)从任一节点到其每一个叶子的全部简单路径都包含相同数目的黑色节点。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3、如何设计一个二叉树的数据结构
一、二叉查找树(BST)由节点组成,因此能够先定义一个节点类,用来保存节点数据和其余节点的连接(left和right);
二、再定义一个二叉查找树类,让类只包含一个数据成员:一个表示二叉查找树根节点的Node对象。该类的构造函数将根节点初始化为 null,以此建立一个空节点;
三、BST 先要有一个 insert() 方法,用来向树中加入新节点;
四、其次检查 BST 是否有根节点,若是没有,那么这是棵新树,该节点就是根节点,这个方法到此就完成了,不然,进入下一步;
五、若是待插入节点不是根节点,那么就须要准备遍历 BST,找到插入的适当位置。该过程相似于遍历链表。用一个变量存储当前节点,一层层地遍历 BST
六、进入 BST 之后,下一步就要决定将节点放在哪一个地方。找到正确的插入点时,会跳出循环。查找正确插入点的算法以下:
(1)设根节点为当前节点。
(2)若是待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反之,执行第 4 步。
(3)若是当前节点的左节点为 null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。
(4)设新的当前节点为原节点的右节点。
(5)若是当前节点的右节点为 null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次循环。
相关文章
相关标签/搜索