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.

posted @ 2018-11-12 16:25  Python爱好者666  阅读(929)  评论(0)    收藏  举报