线索二叉树和中序非递归遍历线索化后的二叉树
2015-10-25 12:19
507 查看
//线索二叉树 #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;//给坐标值赋值为0 CreateBiThrTree(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
中序线索化二叉树
相关文章推荐
- Servlet(五岁以下儿童)web.xml一些常用的配置
- 设计之惑
- Android第三方注解框架Annotations和butterknife
- Android Code Style Guidelines for Contributors
- 作業系統之前的程式 for stm32f4discovery (3) - usart
- 简单工厂的来世今生
- xml 将xml文档以表格的形式输出
- Struts2通过json前后自动给后台自定义对象赋值
- 2011 Asia Dalian Regional Contest
- Oracle数据库基础(五)--索引,触发器
- vi编辑器
- (二期)IOS调试技巧
- jquery滚动加载
- Zoj 3545 Rescue the Rabbit(ac自己主动机+dp)
- 信息安全系统设计基础第七周学习总结
- CSRF验证失败. 相应中断
- C语言,回溯法0-1背包问题
- 第一个使用ajax的spring mvc程序
- 数据库
- 语言,模式,设计