【数据结构】4. 树与二叉树(5)
其中标志域含义如下:
线索二叉树的存储结构描述如下: typedef struct ThreadNode { ElemType data; //数据元素 struct ThreadNode *lchild,*rchild; //左、 右孩子指针 int ltag,rtag; //左、 右线索标志 } ThreadNode,*ThreadTree; 以这种结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表。 (2)线索二叉树的构造对二叉树的线索化,实质上就是遍历一次二叉树,只是在遍历的过程中,检査当前结点左、右指针域是否为空,若为空,将它们改为指向前驱结点或后继结点的线索。 通过中序遍历对二叉树线索化的递归算法如下: void InThread(ThreadTree Sp,ThreadTree &pre) { //中序遍历对二叉树线索化的递归算法 if(p != NULL) { InThread(p->lchild,pre); //递归,线索化左子树 if(p->lchild == NULL){ //左子树为空,建立前驱线索 p->lchild = pre; p->ltag = 1; } if(pre != NULL && pre->rchild==NULL) { pre->rchild = p; //建立前驱结点的后继线索 pre->rtag = 1; } pre = p; //标记当前结点成为刚刚访问过的结点 InThread(p->rchild,pre); //递归,线索化右子树 }//if(p!=NULL) } 通过中序遍历建立中序线索二叉树的主过程算法如下: void CreatelnThread(ThreadTree T) { ThreadTree pre NULL; if(T != NULL){ //非空二叉树,线索化 InThread(T,pre); //线索化二叉树 pre->rchild = NULL; //处理遇历的最后一个结点 pre->rtag = 1; } } 有时为了方便,仿照线性表的存储结构,在二叉树的线索链表上也添加一个头结点(见图 4-11),并令其 lchild 域的指针指向二叉树的根结点,其 rchild 域的指针指向中序遍历时访问的最后一个结点; (3)线索二叉树的遍历中序线索化二叉树主要是为访问运算服务的,这种遍历不再需要借助栈,因为它的结点中隐含了线索二叉树的前驱和后继信息。
4.4 树、森 林4.4.1 树的存储结构树的存储方式有多种,既可以采用顺序存储结构,也可以采用链式存储结构,但无论采用何种存储方式,都要求能唯一地反映出树中各结点之间的逻辑关系,这里介绍 3 种常用的存储结构。
双亲表示法的存储结构描述如下: #define MAX_TREE_SIZE 100 typedef struct { ElemType data; int parent; } PTNode; typedef struct { //树的类型定义 PTNode nodes[MAX_TREE_SIZE]; //双亲表示 int n; //结点数 } PTree; (编辑:ASP站长网) |