【数据结构】4. 树与二叉树
| 其中标志域含义如下: 
 线索二叉树的存储结构描述如下: 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 种常用的存储结构。 
 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 




