二叉树线索化与遍历线索二叉树

    若某程序中所用二叉树经常遍历或查找节点在遍历所得线性序列中的后继和前驱,适用于线索链表存储结构即线索二叉树。

#include <iostream>
using namespace std;
struct bithrnode//线索二叉树节点
{
	char date;
	bithrnode *lchild,*rchild;
	int ltag,rtag;//左右标记,0为指针,1为线索
};
class bithrtree
{
private:
	bithrnode *root;
	bithrnode *pre;//pre始终指向刚刚访问(即中序遍历中输出过)过的节点
	bithrnode *q;//q指向当前访问的节点
public:
	bithrtree()//这里引入根节点的作用是在建立变量bithrtree的时候就开始生成树
		    //不必再引用create函数
	{
		create(root);
	};
    ~bithrtree();
	bithrnode *getroot()
	{
		return root;
	}
	void create(bithrnode *jj)//建立二叉树
	{
		char aa;
		cin>>aa;
		if(aa==' ') jj=NULL;
		else
		{
			jj=new bithrnode;
			jj->date=aa;
			create(jj->lchild);
			create(jj->rchild);
		}
	}
	void inorderthreading(bithrnode *aa)//中序遍历的二叉树线索化
	{
		//bithrtree *thrt=&aa(注释bithrtree aa)

		bithrnode *thrt=new bithrnode;//建立头节点
		thrt->ltag=0; thrt->rtag=1;
		if(aa) thrt->lchild=thrt;
		else
		{
			thrt->lchild=aa; 
			pre=thrt;
			inthreading(aa);
			pre->rchild=thrt;//中序遍历后pre为最后一个叶子节点
			pre->rtag=0;
			thrt->rchild=pre;
		}
	}
	void inthreading(bithrnode *bb)
	{
		if(bb)
		{
			inthreading(bb->lchild);
			if(!bb->lchild) {bb->ltag=1;bb->lchild=pre;}
			if(!pre->rchild) {pre->rtag=1;pre->rchild=bb;}
			pre=bb;
			inthreading(bb->rchild);
		}
	}<pre name="code" class="cpp">	void inordertraverse(bithrnode *head)//中序遍历线索二叉树
	{
		bithrnode *pp=head->lchild;
		cout<<pp->date;
		while(pp!=head)
		{
			while(pp->lchild) pp=pp->lchild;
			cout<<pp->date;
			while(pp->rtag==1&&pp->rchild!=head)
			{
				pp=pp->rchild;
				cout<<pp->date;
			}
			pp=pp->rchild;//
		}
	}

}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值