ref: https://www.cnblogs.com/manji/p/4903990.html
概念:
什么是树:
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。
树的结点,根,子叶:
一棵树(tree)是由n(n>0)个元素组成的有限集合,其中:
(1)每个元素称为结点(node);
(2)有一个特定的结点,称为根结点或根(root);
(3)除根结点外,其余结点被分成m(m>=0)个互不相交的有限集合,而每个子集又都是一棵树(称为原树的子树)
(4)除了根节点外,没有子结点的结点称为叶子。
(5)若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"。
(6)有相同双亲的结点互为"兄弟"。
(7)一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结点都是该结点的祖先。
树的(宽)度:
在树结构中,一个结点所拥有的后件个数称为该结点的度。度,也即是宽度。
以组成该树各结点中最大的度作为该树的度,树中度不为零的结点称为分枝结点或非终端结点。除根结点外的分枝结点统称为内部结点。
例如:
图 1.1
在图 1.1 中:A结点的度为3,B结点的度为2,c结点的度为1,D结点的度为3。
E、F、G、H、I 以及J度都为0,称为叶子结点.
树的高度:
从根节点到所有叶节点中最大的边的数目。
树的深度:
树从根结点开始往下数,叶子结点所在的最大层数称为 树的深度。
根节点在第0层时候,按照北大数据结构视频的说法就是:高度数结点数,深度数路径。
例如:
如图 1.2 中,B的子树是C和D,数B的高度时候,B的子树中离B最远的叶子节点是G,所以G高度为1,B高度4,D高度3。
但是C是叶子节点,C没有真子树,C高度就是1。
图 1.2
二叉树:
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
二叉树常被用于实现二叉查找树和二叉堆。
满二叉树(full binary tree):
一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。除了树叶以外,每个结点都有2给子叶。
这种树的特点是每一层上的节点数都是其能够拥有的最大节点数。
完全二叉树(complete binary tree):
在一棵二叉树中,除最后一层外,各层结点全满,最后一层节点全部靠左,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。
深度为k的完全二叉树,至多有2k-1个叶子节点,至多有2k-1个节点。
理想二叉树( perfect binary tree)
所有的结点全满。理想二叉树同时也是满二叉树与完全二叉树
二叉树的遍历(注意,二叉树的遍历是递归的)
注:左孩子优先于右孩子
根据根节点的顺序命名:
先序(前序)遍历: 先访问本节点,再访问该节点的左孩子和右孩子(如果有);
中序遍历: 先访问左孩子,再访问本节点,最后访问右孩子(如果有);
后序遍历: 先访问左右孩子,最后访问本节点(如果有)。
中序遍历: 先访问左孩子,再访问本节点,最后访问右孩子(如果有);
后序遍历: 先访问左右孩子,最后访问本节点(如果有)。
层次遍历: 按照层次关系依次遍历树的节点
可以证明:右孩子优先的先序遍历序列的逆序列就是左孩子优先的后序遍历序列。
树,二叉树,森林各种遍历总结:
树的前序遍历,对应二叉树的前序遍历。
树的后序遍历,对应二叉树的中序遍历。
树的层次遍历,对应二叉树的后序遍历。
森林的前序遍历,对应二叉树的前序遍历。
森林的中序遍历,对应二叉树的中序遍历。
二叉排序树
又叫二叉查找树或者二叉搜索树,它首先是一个二叉树,而且必须满足下面的条件:
1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;
2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值
3)左、右子树也分别为二叉排序树
4)没有键值相等的节点(?可能是因为不好处理键值相等的节点到底是左节点还是右节点吧)