数据结构---树、二叉树、森林

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:将每棵二叉树转换为树

posted on 2014-07-28 14:39  xiaogua918  阅读(5338)  评论(0编辑  收藏  举报