首页 > 代码库 > 数据结构---树、二叉树、森林
数据结构---树、二叉树、森林
1、基本术语:
度:有两种度“结点的度”与“树的度”。结点的度指的是一个结点子树的个数;树的度是指树中结点度的最大值。
叶子结点:指的是没有子树的结点。
层:树是有层次的,一般根结点为第0层。规定根结点到某结点的路径长度为该结点的层数。
深度:树中结点的最大层数
兄弟:同一双亲的结点,互为兄弟
堂兄弟:双亲在同一层次的结点,互为堂兄弟
祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先。
子孙:以某一结点为根的子树上的所有结点都是该结点的子孙
森林:n棵互不相交的树
2、二叉树:
不同于树,结点的度<=2,而且子树有左右之分,如下图:
编号规则为从左到右、从上到下,如下图:
性质1:位于第i层的结点个数不大于2的i次方。
性质2:二叉树的深度为n,二叉树总的结点个数不大于2的n+1次方减去1。
性质3:叶子节点个数 = 度为2的结点个数 + 1
满二叉树:除了最底层的结点外,其余结点的度均为2,如下图
完全二叉树:不一定满,若一个二叉树有n个结点,他与满二叉树编号为1-n的结点一一对应。这样的二叉树称为完全二叉树
性质1:编号为i的结点的双亲编号为i/2,结果取整
性质2:便哈为i的结点的左孩子编号为2i,右孩子编号为2i+1
性质3:完全二叉树的结点总数为n,则该完全二叉树的高为log以2为底求n的对数,结果取整
二叉树的实现:
顺序存储:
对于完全二叉树和满二叉树可以利用完全二叉树的性质2来定位双亲和孩子的位置。如下图:
对于一般的二叉树,采取补值的方法将二叉树补成完全二叉树,再利用完全二叉树的顺序存储方式。
链式存储:
结点包含3个值:数据域、指向左子树的指针、指向右子树的指针
二叉树的遍历:
先根遍历:DLR 首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
中根遍历:LDR 首先遍历左子树然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
后根遍历:LRD 首先遍历左子树然后遍历右子树,最后访问根结点。在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。
树如何转换成二叉树?
步骤1:仅保留最左边孩子与根节点的连线,并连接兄弟结点。如下图,B是A最左边的孩子,所以保留A与B的连线,断开A与C,A与D的连线。B、C、D是兄弟,所以将BCD连接起来。对于以B、C、D为根的子树仍然按照这样的规则转换。
步骤2:左子树顺时针旋转45度,便得到了转换后的二叉树
二叉树如何转换成树?
步骤1:与树转换成二叉树的步骤相反,左子树逆时针旋转45度
步骤2:断开兄弟之间的连线,连接双亲。
森林如何转换成二叉树?
步骤1:每棵树都先转换为二叉树
步骤2:以第一棵树的根结点为根结点,将根结点依次连接起来
步骤3:按照根结点顺时针旋转45度
二叉树如何转换成森林?
步骤1:断开根结点与右子树的连线,对于右子树仍然按照规定断开与右子树的连线。这样得到多个二叉树
步骤2:将每棵二叉树转换为树