Python树的概念
1、定义
1)非线性结构,每个元素可以有多个前驱和后继。
2)树是n(n>=0)个元素的集合。
n=0时,称为空树。
树只有一个特殊的没有前驱的元素,称为树的根root。
树中除了根节点外,其余元素只能有一个前驱,可以有零个或者多个后继。
2、递归定义
树T是n(n>=0)个元素的集合,n=0时,称为空树。
有且只有一个特殊元素根,剩余元素都可以被划分为m个互不相交的集合T1、T2、T3、.....、Tm,而每个元素都是树,称为T的子树。
子树也有自己的根。
3、树的概念
结点:树中的数据元素。
结点的度degree:结点拥有子树的树木称为度。记作d(v)。
叶子结点:结点度为0,称为叶子结点leaf、终端结点、末端结点。
分支结点::结点的度不为0,称为非终端结点或分支结点。
分支:结点之间的关系
内部结点:除了根结点外的分支结点,不包括子结点。
树的度是树内各结点的度的最大值。D的结点度最大为3,树的度数就是3.
孩子结点:结点的子树的根结点成为该结点的孩子。
双亲结点:一个结点是它各子树的根结点的双亲。
兄弟结点:具有相同双亲结点的结点:
祖先结点:祖先结点:从根结点到该结点所经分支上所有的结点。A、B、D都是G的祖先结点。
子孙结点:结点的所有子树上的结点都是该结点的子孙》B的子孙是DGHI
结点的层次:根结点为第一层,根的孩子为第二层,依次类推,记作L(v)
树的深度(高度Depth):树的层次的最大值,上图的树深度为4
堂兄弟:双亲的同一层的结点
有序树:结点的子树是有顺序的(兄弟有大小,有先后次序),不能交换。
无序树:结点的子树是有无序的,可以交换。
路径:树中的k个结点n1、n2、....、nk。满足ni是n(i+1)的双亲,成为你到nk的一条路径。就是一条线串下来的,前一个都是后一个的父(前驱)结点。 路径就是一串从上到下:a到g。
路径长度=路径上的结点树-1,也是分支树。长度就是-1.
森林:m(m》=0)棵不相交的树的集合,对于结点而言,其树的集合就是森林。A的结点的2棵子树的集合就是森林。
4、树的特点
唯一的根
子树不相交
除了根以外。每个元素只能有一个前驱,可以有零个或者多个后继。
根结点就没有双亲结点(前驱),叶子结点没有孩子结点(后继)
Vi是vj的双亲,则L(vi)=L(vi)-1,也就是双亲比孩子结点的层次小1.
堂兄弟的双亲不一定是兄弟关系。
5、二叉树
1)每个结点最多两棵子树。(二叉树不存在度数大于2的结点)
是有序树,左子树,右子树是顺序的,不能交换次序。
即使某个结点只有一个结点,也要确定其为左子树还是右子树。
2)二叉树的五种基本形态。
空二叉树
只有一个根结点
根结点只有左子树
根结点只有右子树
根结点左右都有子树。
3)斜树:
左斜树,所有结点都在左结点。
右斜树,所有结点都在右结点。
4)满二叉树
一颗二叉树的所有分支结点都存在左子树和右子树,并且所有叶子结点只是存在最下面一层。
K为深度 ,结点总数为(2**k)-1
5) 完全二叉树:(满二叉树是完全二叉树,但是完全二叉树不一定是满二叉树。)
若二叉树的深度为k,二叉树的层数从1到k-1层的结点树都达到了最大数,在第k层的所有的结点都集中在左边,这就是完全二叉树.
完全二叉树由满二叉树引出.
K为深度(1<=k<=n\),则结点总数的最大值为2**k-1,当达到最大值的时候就是满二叉树.
6)二叉树的性质:
性质1:在二叉树的第i层上至多有2^i -1个结点(i》=1) #例如第二层有两个结点.
性质2:深度为k的二叉树,至多有2**k-1个结点,一层:2-1 二层 4-1=1+2+3 三层8-1=1+2+4=7
性质3:对任何一颗二叉树T,如果其终端结点树为n0,度数为2的结点为n2,则有n0=n2+1(就是叶子树结点的树-1就等于度数为2的结点树.
证明:总结点数n=n1+n2+n3.
一棵树的分支数为n-1,因为除了根结点外。其余结点都有一个分支,n0+n1+n2-1.
分支数还等于n0*0+n1*1+n2*2,n2是2分支结点所以乘以2,2*n2+n1.
可得2*n2+n1=n0+n1+n2-1=>n2=n0-1
其它性质:
高度为k的二叉树,至少有k个结点
含有n(n>=1)的结点的二叉树高度至多为n。
含有n(n>=1)的结点树的二叉树的高度至多为n,最小为math.ceil(log2(n+1)),不小于对数值的最小整数, 向上取整。层次树是取整.
如果是8个结点,向上取整为4,为4层.
性质4:具有n个结点的完全二叉树的深度为int(log.n)+1或者math.ceil(log2(n+1))
性质5:如果有一颗n个结点的完全二叉树(深度为性质4),结点按照层序编号.
如果i=1,则结点i是二叉树的根,无双亲,如果i>1,则双亲是int(i/2),向下取整。就是子结点的编号整除2得到的就是父结点的编号,父结点如果是i,那么左孩子的结点就是2i,右结点是2i+1.
如果2i》n,则结点i无左孩子,即结点为叶子结点,否则其左孩子结点存在编号为2i
如果2i+1》n,则结点i无右孩子,不能说明结点i没有左孩子,否则右孩子的结点存在编号为2i+1.
浙公网安备 33010602011771号