数据结构-树的逻辑操作

17 阅读3分钟

树结构除了可以是二叉树和树之外,还可以是有多棵树和二叉树组成的森林。本文就着重讲述二叉树、树和森林之间的转换,以及树和森林的遍历。

树之间的转换

树转换为二叉树

一般来说,在树转换为二叉树时,需要让每个结点的左指针指向该结点的第一个孩子结点(即最左侧的孩子结点),右指针指向该结点右侧的第一个兄弟结点(相邻的右兄弟结点)。这种方法可以简称为“左孩子右兄弟”。

根节点没有兄弟结点,所以这种方法转换而来的二叉树没有右子树,右子树的位置可以留给其他的操作,比如森林转换为二叉树,这个下文会讲。

森林转换为二叉树

森林是由多棵树组成的数据结构,而带有多棵树的森林转换为二叉树也比较简单:首先,我们将森林中的每一棵树转换为二叉树,之后根据森林的左右顺序,将第二棵树插入到第一棵树的根结点的右子树位置,并以此类推。这样就实现了森林到单棵二叉树的转换。

二叉树转换为森林

二叉树转换为森林一般采取这种方法:从根结点开始,如果结点有右子树,就将其拆开,并观察拆分后的子树,以此类推直到结点没有右子树为止,这样就转换为了许多二叉树组合而成的森林。之后再将每棵二叉树转换为树:遍历结点,如果结点有右孩子结点,就将其转换为该结点的右兄弟结点,这样就完成了二叉树到树的转换。

树的遍历

树的遍历

任何树的遍历主要有两种形式,我们将其称之为先根遍历和后根遍历。

先根遍历就是先从根结点访问数据,再从左到右遍历每棵子树;而后根遍历就是先从左到右遍历每棵子树,最后再访问对应结点。

前文说过,树是可以转换为二叉树的,先根遍历得到的序列和对应树转换后二叉树的先序遍历得到的序列一致;后根遍历得到的序列和对应树转换后二叉树的中序遍历得到的序列一致。

森林的遍历

森林的遍历也有两种方法,分别是先序遍历森林和中序遍历森林。

先序遍历森林首先访问森林中第一棵树的根节点,之后先序遍历这棵树根节点的子树森林,之后再先序遍历剩下的树组成的森林。

中序遍历森林首先中序遍历第一棵树根节点的子树森林,再访问森林中第一棵树的根结点,之后再中序遍历剩下的树组成的森林。

这种遍历方法的好处是比较方便在计算机中实现,因为其遍历操作有大量的递归操作。