c++二叉树的中序线索链表
来源:互联网 发布:手机淘宝生日在哪设置 编辑:程序博客网 时间:2024/06/08 09:26
<div class="para" label-module="para">建立线索二叉树,或者说对二叉树线索化,实质上就是遍历一棵二叉树。在遍历过程中,访问结点的操作是检查当前的左,右指针域是否为空,将它们改为指向前驱结点或后续结点的线索。为实现这一过程,设指针pre始终指向刚刚访问的结点,即若指针p指向当前结点,则pre指向它的前驱,以便设线索。</div><div class="para" label-module="para"> </div><div class="para" label-module="para"><img src="http://img.blog.csdn.net/20161018143644296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></div><div class="para" label-module="para"> </div>
#include <iostream>using namespace std;enum flag {Child,Thread};//child为0,thread为1struct ThrNode{ char data; ThrNode *lchild,*rchild; flag ltag,rtag;};class InThrBiTree{public: InThrBiTree(); ThrNode *Next(ThrNode *p); void InOrder();private: ThrNode *root,*p,*q; ThrNode *Creat(ThrNode *bt); void ThrBiTree(ThrNode *bt);};ThrNode *pre=NULL;//定义pre(前驱)为空ThrNode *InThrBiTree::Creat(ThrNode *bt){ char ch; cin>>ch; if(ch=='#')bt=NULL; else { bt=new ThrNode; bt->data=ch; bt->ltag=Child; bt->rtag=Child; bt->lchild=Creat(bt->lchild); bt->rchild=Creat(bt->rchild); } return bt;}void InThrBiTree::ThrBiTree(ThrNode *bt)//中序线索化链表算法{ if(bt!=NULL) { if(bt->ltag==Child)//左线索为0,即有左孩子时,继续递归 ThrBiTree(bt->lchild); if(bt->lchild==NULL)//直到左孩子为空,即左线索为1时 { bt->ltag=Thread; bt->lchild=pre;//pre初值为空 } if(bt->rchild==NULL)//若右孩子为空,即右线索为1时 bt->rtag=Thread; if(pre!=NULL&&pre->rtag==Thread)//若前驱非空且前驱的右线索为1(没有右孩子)时 pre->rchild=bt;//前驱的右孩子就为bt pre=bt;//令bt为新的pre if(bt->rtag==Child)//若左线索为0,即左孩子存在时,继续递归 ThrBiTree(bt->rchild); }}InThrBiTree::InThrBiTree(){ root=Creat(root); ThrBiTree(root);//建立线索}ThrNode *InThrBiTree::Next(ThrNode *p)//查找后继算法{ q=new ThrNode; if(p->rtag==Thread)//若标志为1,即没有右孩子 q=p->rchild;//可以直接得到后继结点 else { q=p->rchild; while(q->ltag==Child)//否则一直寻找直到左线索为0,即有左孩子时 { q=q->lchild; //得到后继 } } return q;//返回后继结点(指针)}void InThrBiTree::InOrder(){ if(root==NULL)return; p=root; while(p->ltag==Child) { p=p->lchild; } cout<<p->ltag<<" "<<p->data<<" "<<p->rtag<<endl; while(p->rchild!=NULL) { p=Next(p); cout<<p->ltag<<" "<<p->data<<" "<<p->rtag<<endl; }}int main(){ InThrBiTree b; b.InOrder(); return 0;}
0 0
- c++二叉树的中序线索链表
- 中序线索二叉树的实现
- 中序线索二叉树的实现
- 线索二叉树的中序遍历
- 二叉树的中序线索化
- (C++)二叉树的线索化 / 线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 中序线索二叉树
- 16.线索二叉树 (中序) 及 线索二叉树的中序遍历
- 【C++】中序线索化二叉树及其遍历
- 【c++】二叉树的线索化
- C语言线索二叉树的实现
- HTML 获取相同 id 但是 不同 div 的元素的值
- 博客搬家~~!
- 关于Fragment中getActivity为Null的问题
- camel-JndiRegistry
- 用友NC开发:保存时报错argument type mismatch
- c++二叉树的中序线索链表
- HEVC帧内/帧间预测:Cross-Component Prediction (CCP)
- 自定义view当中的onmeasure()方法详解
- PHP结合memcacheq消息队列解决并发问题
- 使用adb命令对手机进行截屏保存到电脑,SDCard
- ArgbEvaluator、TypeEvaluator
- 如何杀死defunct僵尸进程
- 关于ThreadLocal的理解
- CocoaPods安装、卸载、使用说明(Mac ox 10.11+)