中序线索二叉树
一、 目的:
- 理解线索的含义,掌握线索二叉树的算法。
- 了解中序线索及其遍历的实现过程。
二、内容:
通过学习同学知道,遍历二叉树是以一定的规则,将二叉树中的结点排列成一个线性序列,得到二叉树的先序序列、中序序列、或者后序序列。这实质是将一个非线性结构进行线性化操作。但是,当以二叉链表作为存储结构时,只能找到左右孩子的信息,而不能找到任意的结点的前驱信息和后继信息。这种信息只能在遍历的动态过程之中才能得到。
试做如下的结点结构:
LCHILD | LTAG | DATA | RTAG | RCHILD |
---|
其中:
Link lchild 域指向结点的左孩子
LTAG=
Thread lchild 域指向结点的线性前驱结点
Link rchild 域指向结点的右孩子
RTAG=
Thread rchild 域指向结点的线性后继结点
以这种结点结构构成的二叉链表作为二叉树的存储结构,叫做线性链表。其中指向结点前驱和后继的指针,叫做线索。加上线索的二叉树叫做线索二叉树。对二叉树进行某种操作使其变为线索二叉树的过程叫做线索化。
在线索二叉树上进行遍历,只要先找到序列的第一个结点,然后依次找结点的后继直到结点的后继为空时为止。
三、程序流程图
四、程序示例
#include<iostream>
using namespace std;
enum TBT{
child=0,thread}; //线索二叉树结点的指针是指向孩子还是前驱后继
typedef struct tbt
{
struct tbt* lchild;
enum TBT ltag;
char data;
enum TBT rtag;
struct tbt* rchild;
}TBTreeNode,*pTBTree;
int createThreadedBinaryTree(pTBTree& root);
void inorderThreadingBinaryTree(const pTBTree& root); //中序线索化二叉树