二叉树(二)
线索二叉树
1.定义
n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。
这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
注意:
线索链表解决了二叉链表找左、右孩子困难的问题,出现了无法直接找到该结点在某种遍历序列中的前趋和后继结点的问题。
2.线索链表的结点结构
线索链表中的结点结构为:
其中:
ltag和rtag是增加的两个标志域,用来区分结点的左、右指针域是指向其左、右孩子的指针,还是指向其前趋或后继的线索。
3.线索二叉树的表示
【例】下面(a)图所示的中序线索二叉树,其线索链表如下面(b)图所示。
注意:
图中的实线表示指针,虚线表示线索。
结点C的左线索为空,表示C是中序序列的开始结点,无前趋;
结点E的右线索为空,表示E是中序序列的终端结点,无后继。
线索二叉树中,一个结点是叶结点的充要条件为:左、右标志均是1。
树、森林与二叉树的转换
树或森林与二叉树之间有一个自然的一一对应关系。任何一个森林或一棵树可惟一地对应到一棵二叉树;反之,任何一棵二叉树也能惟一地对应到一个森林或一棵树。
1.树、森林到二叉树的转换
(1)将树转换为二叉树
树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树:
①在所有兄弟结点之间加一连线;
②对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线。
【例1】下面(a)图所示的树可转换为(c)图所示的二叉树。
注意:
由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。
2)将一个森林转换为二叉树
具体方法是:
① 将森林中的每棵树变为二叉树
② 因为转换所得的二叉树的根结点的右子树均为空,故可将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
【例2】下图中,左边包含三棵树的森林可转换为右边的二叉树。
2.二叉树到树、森林的转换
把二叉树转换到树和森林自然的方式是:若结点x是双亲y的左孩子,则把x的右孩子,右孩子的右孩子,…,都与y用连线连起来,最后去掉所有双亲到右孩子的连线。
树的存储结构
1.双亲链表表示法
双亲链表表示法利用树中每个结点的双亲唯一性,在存储结点信息的同时,为每个结点附设一个指向其双亲的指针parent,惟一地表示任何-棵树。
(1)双亲链表表示法的实现
方法① 用动态链表实现
方法② 用向量表示——更为方便
例】图6.17(a)的双亲链表表示如下面数组所示。
分析:
E和F所在结点的双亲域是1,它们的双亲结点在向量中的位置是1,即B是它们的双亲。
注意:
① 根无双亲,其parent域为-1。
② 双亲链表表示法中指针parent向上链接,适合求指定结点的双亲或祖先(包括根);求指定结点的孩子或其它后代时,可能要遍历整个数组。