线索二叉树(解释)
来源:互联网 发布:如何看待网络暴力现象 编辑:程序博客网 时间:2024/05/18 02:27
struct TBTNode{char data;TBTNode* lchild;TBTNode* rchild;int ltag,rtag;};//TBTNode与BTNode相差了ltag和rtag分别代表左边和右边是否为线索;如果左边是线索,那么ltag=1,否则为0;如果右边是线索,那么rtag=1,否则为0;TBTNode* pre;//代表线索化中的前一个访问节点void Thread(TBTNode* &p)//输入根节点,建立线索化;{if(p!=NULL)//这里用了递归,有点难理解;其实递归是整体与局部的关系,这里可以假设只有三个节点,根节点,根节点的左节点和右节点{Thread(p->lchild);//线索化根节点的左节点,此时pre会被赋值为左节点,p为当前根节点,下面对pre和p节点线索if(p->lchild==NULL)//如果左节点为空,那么将左孩子指针指向前驱节点pre;{p->ltag=1;p->lchild=pre;}elsep->ltag=0;if(pre->rchild==NULL)//如果pre的右节点为空,那么右孩子指针指向直接后继p{pre->rchild=p;pre->rtag=1;}elsepre->rtag=0;pre=p;//此时pre变成了p节点Thread(p->rchild);//对p节点的右节点线索化}}TBTNode* CreateThread(TBTNode* &b){TBTNode* root;root=(TBTNode*)malloc(sizeof(TBTNode));//构造头节点root->ltag=0;//左指针指向根节点root->rtag=1;//右指针用来线索root->rchild=b;//如果此时,只有一个节点(即根节点),那么右指针指向最后一个节点即根节点if(b==NULL)//如果,头结点为空,那么左指针指向自己root->lchild=root;else//将pre赋值为root,然后线索化{ root->lchild=b; pre=root; Thread(b); pre->rchild=pre;//此时的pre为中序遍历的最后节点,那么将它的右指针指向头节点 pre->rtag=1;//rtag表示线索 root->rchild=pre;//将头结点的右指针线索指向最后节点pre; return root;//返回头节点 }}
void ThInOrder(TBTNode* tb)//这是遍历线索二叉树{TBTNode* p=tb->lchild;//p指向根节点while(p!=tb){while(p->ltag==0) p=p->lchild;//找到中序遍历中的第一个节点cout<<p->data<<endl;//输出该节点的值while(p->ltag==1 && p->rchild!=tb)//循环找其后继节点(如果存在线索,即rtag=1,并且不是最后个节点){p=p->rchild;cout<<p->data<<endl;}p=p->rchild;//如果rtag=0,有右节点,那么重新赋值p,去找下个节点}}
0 0
- 线索二叉树(解释)
- 6.3线索二叉树(二叉树的线索化)
- (C++)二叉树的线索化 / 线索二叉树
- 线索二叉树(上)
- 线索二叉树(下)
- 线索二叉树(复习)
- 线索二叉树(二)
- 数据结构 树(线索二叉树)
- 线索二叉树 --->树
- 线索二叉树(C# 2.0)
- morris traversal(线索二叉树)
- 线索二叉树(中序索引)
- 数据结构--二叉树(线索链表)
- (1.2.5.3)线索二叉树
- 线索二叉树(Threaded Binary Tree)
- 二叉线索树(Threaded binary tree)
- 中序线索二叉树(Java)
- 二叉树的线索化(一)
- MySQL和PostgreSQL的远程备份与恢复
- MFC中对象序列化技术的实现
- 多线程和多进程的区别
- NPN传感器PNP传感器原理和分类
- 关于Django的TIME_ZONE时区问题的若干总结
- 线索二叉树(解释)
- 坦诚相待
- Android创建标签页的两种方式
- make 伪目标
- 黑马程序员_Java异常处理
- 最小堆与最大堆的实现
- JDBC与CMD方式执行MySQL文件
- Z0-851-Oracle认证专家,Java SE 6的程序员考试
- epoll的LT和ET模式