python 树
Posted 栗子测试
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 树相关的知识,希望对你有一定的参考价值。
# 树
# 非线性结构,每个元素可以有多个前驱和后继
# 树是n个元素的集合(n>=0)
# n=0时,称为空树
# 树只有一个特殊的没有前驱的元素,叫做根root
# 树中除了根节点外,其他元素只能有一个前驱,可以有多个后继
# 递归
# 树T是n个元素的集合(n>=0)。n=0时,称为空树
# 有且只有一个特殊元素根,剩余元素都可以划分为m个互不相交的集合T1、T2...Tm。而每一个集合都是树,称为T的子树
# 树的概念
# 结点:树中的元素
# 结点的度(degree):结点拥有的子树的数目,记作d(v)
# 叶子节点:结点度为0,称为叶子结点leaf
# 分支结点:结点度不为0,称为分支结点
# 分支:结点之间的关系
# 内部结点:除根结点外的分支结点,当然也不包含叶子结点
# 度:树的度是树内各节点的度的最大值。D结点度最大为3,树的度就是3
# 子节点(child):结点的子树的根结点称为该节点的孩子
# 双亲节点(parent):一个结点是它各个子树跟结点的双亲
# 兄弟结点(sibling):有同样父节点
# 祖先结点:从根节点到节点G所经过的分支上所有的结点,都是结点G的祖先
# 子孙节点:结点的所有子树上的结点都是子孙节点
# 结点的层次(level):根结点为第一层、根的孩子为第二层,以此类推,记作L(v)
# 树的深度(depth):树的层次的最大值
# 堂兄弟:双亲在同一层的结点
# 有序树:结点的子树是有顺序的,不能交换
# 无序树:结点的子树是无顺序的,可以交换
# 路径:从叶子结点链接到跟结点(保证前一个是吼一个的父节点)
# 路径长度:路径上节点数-1,也是分支数
# 森林:m(m>=0)棵不相交的树的集合
# 对于节点而言,其子树的集合就是森林。A结点的2棵子树的集合就是森林
# 树的特点
# 根唯一
# 子树不相交
# 除了根以外,每个元素只能有一个前驱,可以有多个后继
# 根节点没有双亲节点(前驱),叶子结点没有孩子结点(后继)
# vi是vj的双亲,则L(vi) = L(vj)-1,也就是说双亲比孩子结点的层次小1
# 二叉树***
# 每个结点最多有2棵子树
# 二叉树不存在度数大于2的结点
# 它是有序树,左子树、右子树是顺序的,不能交换次序
# 即使某个结点只有一颗子树,也要确定它是左子树还是右子树
# 二叉树的5中基本形态
# 空二叉树
# 只有一个根结点
# 根结点只有左子树
# 根结点只有右子树
# 根结点有左子树和右子树
# 斜树(是二叉树)
# 左斜树,所有节点都只有左子树
# 右斜树,所有结点都只有右子树
# 满二叉树***
# 一棵二叉树的所有分支结点都存在左子树和右子树,且所有叶子结点只存在在最下面一层
# 同样深度的二叉树中,满二叉树结点最多
# k为深度(1=<k=<n),则结点总数为2的k次方-1
# 一个深度为4的满二叉树,节点数为2^4-1=15
# 完全二叉树
# 若二叉树的深度为k,二叉树的层数从1到k-1层的结点数都达到了最大个数,在第k层的所有结点都集中在最左边,这就是完全二叉树
# 最后一层从左边开始放*
# 完全二叉树由满二叉树引出
# 满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树
# k为深度(1=<k=<n),则结点总数最大值为2的k次方-1,当达到最大值的时候就是满二叉树
# 二叉树的性质
# 1 在二叉树的第i层上,至少有2^(i-1)个结点(i>=1)
# 2 深度为k的二叉树,至少有2^k-1个结点(k>=1)
# 3 对任何一棵二叉树T,叶子结点数位n0,度数为1的结点数位n1,度数为2的结点数为n2
# n0 = n2 + 1(即:叶子结点数 - 1 就等于度数为2的结点数)
# 总结点数n = n0 + n1 + n2
# 分支数 = n - 1 = n0 + n1 + n2 - 1
# 分支数 = n0*0 + n1*1 + n2*2
# 所以 n0 + n1 + n2 - 1 = n0*0 + n1*1 + n2*2 ==> n2 = n0 - 1
# 4 高度为k的二叉树,至少有k个结点
# 5 含有n(n>=1)个结点的高度至多为n
# 6 含有n(n>=1)个结点的高度至少为math.ceil(log2(n+1)),向上取整
# 7 具有n个结点的完全二叉树的深度为int(log2n)或者math.ceil(log2(n+1))
# 8 具有n个结点的完全二叉树,结点按照层次编号
# 如果i=1,则结点i是二叉树的根结点
# 如果i>1,则其双亲是int(i/2),向下取整
# 如果父结点是i,那么左孩子结点就是2i,右孩子结点是2i+1
# 如果2i>n,则结点i无左孩子,即结点i为叶子结点;否则其左孩子存在编号为2i
# 如果2i+1>n,则结点i无右孩子,注意这里并不能说明结点i没有左孩子;否则右孩子存在编号为2i+1
以上是关于python 树的主要内容,如果未能解决你的问题,请参考以下文章