线索二叉树和中序非递归遍历线索化后的二叉树

来源:互联网 发布:数据挖掘十大经典算法 编辑:程序博客网 时间:2024/05/18 12:38
//线索二叉树#include<stdio.h>#include<malloc.h>#include<process.h>#define OVERFLOW -2//二叉树的二叉线索存储结构enum PointerTag{Link,Thread};  //枚举类型,Link(0):指针,Thread(1):线索struct BiThrNode{char data;BiThrNode *lchild,*rchild;//左右孩子指针PointerTag LTag,RTag;//左右标志};typedef BiThrNode *BiThrTree;//按照先序的次序输入二叉树中节点的值,构造线索二叉树T,char,空格表示空节点void CreateBiThrTree( BiThrTree &T){char ch;scanf("%c",&ch);if(ch == ' ')T=NULL;else{T=(BiThrTree)malloc(sizeof(BiThrNode));//生成根节点,先序if(!T)exit(OVERFLOW);T->data=ch;//给根节点赋值CreateBiThrTree(T->lchild);//递归构造左子树if(T->lchild)//如果有左孩子T->LTag=Link;//给坐标值赋值为0CreateBiThrTree(T->rchild);//递归构造右子树if(T->rchild)T->RTag=Link;//如果有右孩子,就给右标志赋值为0}} BiThrTree pre;//全局变量,始终指向刚刚访问过的节点//通过中序遍历进行中序线索化,线索化之后,pre指向最后一个节点void InThreading(BiThrTree p)//p为指向根节点的指针{if(p)//线索二叉树不空{InThreading(p->lchild);//递归左子树线索化if(!p->lchild)//左子树为空{p->LTag=Thread;//左标志为线索p->lchild=pre;//左孩子指针指向前驱}if(!pre->rchild)//如果前驱没有右孩子{pre->RTag=Thread;//前驱的右孩子为线索pre->rchild=p;//前驱的右孩子节点指向其后继节点,(即当前节点p)}pre=p;//保持pre指向p的前驱InThreading(p->rchild);//递归右子树线索化}}//中序遍历二叉树T,将其中序线索化,Thrt指向头结点void InOrderThreading(BiThrTree &Thrt,BiThrTree T){Thrt=(BiThrTree)malloc(sizeof(BiThrNode));//生成头结点if(!Thrt)exit(OVERFLOW);Thrt->LTag=Link;//建立头结点左标志为指针Thrt->RTag=Thread;//右标志为线索Thrt->lchild=Thrt;//右指针回指if(!T)//如果二叉树空则左指针回指Thrt->lchild=Thrt;else{Thrt->lchild=T;//头指针的左指针指向根节点pre=Thrt;//pre的初值指向头结点InThreading(T);//中序遍历,进行中序线索化,pre指向中序遍历后的最后一个节点//收尾工作pre->RTag=Thread;//最后一个节点的右标志为线索pre->rchild=Thrt;//最后一个节点的右指针指向头结点Thrt->rchild=pre;//头节点的右指针指向中序遍历的最后一个节点}}//中序遍历线索化后的二叉树T(头节点)的非递归算法void InOrderTraverse_Thr(BiThrTree T){BiThrTree p;p=T->lchild;//p指向根节点while(p != T) //空树或者是遍历结束时,p==T{while(p->LTag == Link)//由根节点一直找到二叉树的最左节点p=p->lchild;printf("%c ",p->data);//访问此节点while(p->RTag == Thread && p->rchild != T)//p->rchild是后继,且不是遍历的最后一个节点{p=p->rchild;printf("%c ",p->data);//访问后继节点}p=p->rchild;//若p->rchild不是线索,p指向右孩子,返回循环,找这棵子树中序遍历的第一个节点}}void main(){BiThrTree H,T;printf("请按照先序的次序输入二叉树:\n");CreateBiThrTree(T);//按照先序产生二叉树InOrderThreading(H,T);//H是头,T是根,中序遍历的过程中,中序线索化二叉树printf("中序遍历线索二叉树:");InOrderTraverse_Thr(H);printf("\n");}

程序的运行结果:

 

以下图片能够帮助你更好地理解本程序:

                      图一 空的二叉树

                                                                                         图二  二叉树的二叉线索存储结构

                                          图三 CreateBiThrTree()产生的二叉树


                图四   中序线索二叉树存储结构


                                                图 5中序线索化二叉树

0 0