C语言实现线索二叉树的前中后创建和遍历详解
目录
- 1.结构
- 1.1初始化tag
- 2.基本操作
- 2.1先序创建二叉树
- 2.2.先序线索化
- 2.2.1.先序遍历
- 2.3.中序线索化
- 2.3.1中序遍历
- 2.4.后序线索化
- 2.4.1后序遍历
- 总结
1.结构
#include#include#define false 0#define true 1using namespace std; typedef struct BTnode{int data; struct BTnode *lchild,*rchild; int ltag,rtag; }*BTree,BTnode;
1.1初始化tag
#include#include#define false 0#define true 1using namespace std; typedef struct BTnode{int data; struct BTnode *lchild,*rchild; int ltag,rtag; }*BTree,BTnode;
2.基本操作
2.1 先序创建二叉树
int j=0; //创建二叉树的全局变量 //先序创建二叉树 int CreateBTree(BTree &T){int str[]={1,2,3,NULL,4,NULL,NULL,NULL,5,6,NULL,7,NULL,NULL,8,NULL,NULL}; if(str[j]=='#') return false; if(str[j]==NULL){T=NULL; j++; }else{T=(BTnode *)malloc(sizeof(BTnode)); T->data=https://www.it610.com/article/str[j]; j++; CreateBTree(T->lchild); CreateBTree(T->rchild); } }
输出函数:
inline bool visit(int e){//此处使用内敛函数,提高运行效率 printf("%d",e); return true; }
2.2.先序线索化
//先序线索化. void prehread(BTree &root){ if(root!=NULL){if(root->lchild==NULL){root->ltag=1; root->lchild=pre; }else{root->ltag=0; }if(pre){if(pre->rchild==NULL){pre->rtag=1; pre->rchild=root; }else{pre->rtag=0; }}pre=root; if(root->ltag==0){prehread(root->lchild); }if(root->rtag==0){prehread(root->rchild); } }}
2.2.1.先序遍历
//寻找先序后继 BTree preNext(BTree T){if(T->rtag==1){return T->rchild; }else{if(T->ltag==0){return T->lchild; }else{return T->rchild; }}}//先序线索二叉树的遍历void prebianli(BTree T){ BTree p; p=T; while(p){visit(p->data); p=preNext(p); }}
文章图片
2.3.中序线索化
//中序线索化BTree pre=NULL ; //中序线索化的全局变量 void Inthread(BTree &root){ if(root!=NULL){Inthread(root->lchild); if(root->lchild==NULL){root->ltag=1; root->lchild=pre; }else{root->ltag=0; }if(pre){if(pre->rchild==NULL){pre->rtag=1; pre->rchild=root; }else{pre->rtag=0; }}pre=root; Inthread(root->rchild); }}
2.3.1 中序遍历
//求中序首结点 BTree InFirst(BTree T){ BTree p=T; if(p==NULL) return NULL; while(p->ltag==0){p=p->lchild; } return p; } //求中序后继 BTree InNext(BTree T) {BTree next=NULL; if(T->rtag==1){next=T->rchild; }else {T = T->rchild; while (T->ltag==0 ) {T = T->lchild; }next=T; }return next; } //中序线索二叉树的遍历void Inbianli(BTree T){ BTree p; p=InFirst(T); while(p){visit(p->data); p=InNext(p); }}
文章图片
2.4.后序线索化
//后续线索化void Postthread(BTree &root){ BTree pre=NULL; if(root){Postthread(root->lchild); Postthread(root->rchild); if(root->lchild==NULL){root->ltag=1; root->lchild=pre; }if(pre&&pre->rchild==NULL){pre->rtag=1; pre->rchild=root; }pre=root; }}
2.4.1 后序遍历
//求后序前驱 BTree postnext(BTree T){ if(T->ltag==0){if(T->rtag==0){return T->rchild; }else{return T->lchild; } }else {return T->lchild; }}//后序遍历void postbianli(BTree T){ BTree p; p=T; while(p){p=postnext(p); visit(p->data); }}
文章图片
总结 tag最好另起函数进行初始化,并且在遍历中,牢抓前中后的遍历次序进行分析。
【C语言实现线索二叉树的前中后创建和遍历详解】本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- R语言模拟疫情传播图RVirusBroadcast展示疫情数据
- 编程语言|TypeScript的另一面(类型编程)
- Java实现顺序表的操作
- VUE页面局部组件刷新
- Java不借助第三变量实现两数交换的示例
- 原生js实现表格循环滚动
- Python实现爬取天气数据并可视化分析
- jquery实现拖拽table表头改变列宽
- Java实现FTP上传与下载功能
- jQuery实现锁定页面元素(表格列)