树形结构是一类重要的非线性结构,树形结构中结点之间具备分支,并具备层次结构关系,相似于天然界中的树; 生活中也大量存在,如家谱,行政组织结构均可以用树形象的表示;算法
既然天然界中存在这种结构的数据,那计算机中也须要相应的数据结构来存储; 在计算机领域树结构也有着普遍的应用,如编译程序中使用树表示语法结构,数据库中用树(索引)来组织数据,分析算法行为时可用树描述其指向过程;数据库
树是n (n>=0)个结点的有限集,记作T;当结点数n为0时称为空树数据结构
当结点数n大于0时,有且仅有一个特定的根结点;spa
除根结点外的其他结点可分为m(m>=0)个互不相交的子集,T1.T2....Tn,其中每一个子集Ti又是一棵树,称之为子树3d
任意一棵树的结点数=分支数+1code
常见的表示法有以下四种:blog
通常表示法索引
文氏图法it
凹入表示法编译
嵌套括号法:
(根(子树,子树,子树))
(A(B(E,F),C,D(G)))
其中第1,4两种最为常见;
结点
度
叶子结点(终端结点)
分支结点(非终端结点)
孩子(子结点)
双亲(父结点)
祖先
子孙
兄弟
结点的层次(计算方式)
堂兄弟
树的深度(高度)
有序/无序树
森林
二叉树是树的一种特殊情形,二叉树在树结构的应用中起着很是重要的做用,由于二叉树有许多良好的性质和简单的物理表示,且任何树均可以与二叉树相互转换,这极大下降了树的存储结构及其运算复杂度;
二叉树是由n(n>=0)个节点组成的有限集合,当结点数n为0时称为空二叉树,当结点数n>0时,每一个节点最多有两个子树,称为左子树和右子树
每一个节点最多只能有两个子树
子树有左右之分,且次序不能颠倒
即便只有一个子树也必须明确左右,这是与树最主要的差异
二叉树与树的对比:
a. 空二叉树
b. 左右子树均为空的二叉树
c. 右子树为空的二叉树
d. 左子树为空的二叉树
b. 左右子树都非空的二叉树
二叉树之因此重要,因其具有如下5个重要特性
1.在二叉树的第i(i>=1)层上最多有2^(i-1)个结点
根据该性质可经过层数计算该层结点数量
2.深度为k(k>=1)的二叉树中最多有(2^k)-1
根据该性质可经过深度计算总节点数
3.任意一颗二叉树,若是其叶子结点数为n0,度为2的节点数为n2,则n0 = n2 + 1
证实:
度为0的结点记为n0,度为1的结点记为n1,度为2的结点记为n2
设总结点数为1,即只有根节点,此时知足n0 = n2+1;
如有总结点数为n的二叉树,设n = k时知足n0 = n2+1;
当总节点数n=k+1,即增长一个新节点,设为s,
若新节点s的的父节点为叶子结点(无子节点),则增长后叶子数n0不变,n2也不变,此时仍知足n0 = n2+1
若新节点s的的父节点为有一个孩子的结点,则增长后叶子数n0 = n0+1,n2=n2+1,此时仍知足n0 = n2+1,
故n=任意值均知足n0 = n2+1
4.具备n个节点的彻底二叉树的深度为floor(log2n)+1
意为:以2为底n的对数向下取整后+1
根据该性质对于彻底二叉树,可经过结点数求树的深度
5.若对有n个节点的彻底二叉树的结点从1开始按层编号(从1层到最后一层,每层从左到右)则树中任意节点i(1<=i<=n)具备如下特性:
2 * i
,不然结点i无左孩子节点,且i为叶子节点2 * i + 1
,不然结点i无右孩子节点根据该性质,可方便的判断节点是不是根节点,求父节点,求左/右子节点,判断是否为叶子结点
满二叉树
深度为k(k>=1),且有(2^k)-1个结点的二叉树.
即:叶子结点的上一层中全部结点的度均为2的二叉树为满二叉树,
彻底二叉树
深度为K的二叉树中,K-1层是满的,且K层结点是左连续的(结点编号是连续的),如图:
即:倒数第二层是满的,且最后一层结点是连续的;
满二叉树是彻底二叉树的特殊情形
初始化Initial(BT):创建一颗空二叉树
求双亲Parent(BT,X):求二叉树BT上节点X的双亲节点,若X为BT的根或X不在BT上,结果为NULL;
求左孩子LChild(BT,X),右孩子RChild(BT,X):求二叉树BT上结点X的左/右孩子; 若X为叶子节点或X不在BT上,结果为NULL;
建二叉树Create(BT):创建一棵二叉树BT
遍历
每一个节点被访问一次,且每一个节点仅访问一次,有四种不一样的遍历方式