线索二叉树

BiTree.h

#include <vector>
#include <iostream>
using namespace std;
enum BiThrNodeType{LINK,THREAD};
template <class T>
struct BiNode
{
	BiThrNodeType ltype,rtype;
	T data;
	BiNode<T> *lchild;
	BiNode<T> *rchild;
};
static BiNode<char> *preNode=NULL;
template <class T>
class BiTree
{
private:
	BiNode<T> *root;
	BiNode<T> *CreateByPre(vector<T>&pre,int &i)
	{
		T e = pre[i];
		i++;
		if(e=='*')
			return NULL;
		BiNode <T> *p = new BiNode<T>;
		p->data = e;
		p->ltype=LINK;
		p->rtype=LINK;
		p->lchild = CreateByPre(pre,i);
		p->rchild = CreateByPre(pre,i);
		return p;
	}
	void PreOrder(BiNode<T> *p)
	{
		if(p==NULL)
			return;
		cout<<p->data<<" ";
		PreOrder(p->lchild);
		PreOrder(p->rchild);
	}
	void MidOrder(BiNode<T> *p)
	{
		if(p==NULL)
			return;
		
		PreOrder(p->lchild);
		cout<<p->data<<" ";
		PreOrder(p->rchild);
	}
	void AftOrder(BiNode<T> *p)
	{
		if(p==NULL)
			return;
		PreOrder(p->lchild);
		PreOrder(p->rchild);
		cout<<p->data<<" ";
	}
	BiTree<T> *CreateByPreMid(vector<T> &pre,vector<T> &mid,int ipre,int imid,int n)
	{
		if(n==0)
			return NULL;
		BiNode<T> *p = new BiNode<T>;
		p->data = pre[ipre];
		for(i=0;i<n;i++)
		{
			if(pre[ipre]==mid[imid+i])
				break;
		}
		p->lchild=CreateByPreMid(pre,mid,ipre+1,imid,i);
		p->rchild=CreateByPreMid(pre,mid,ipre+i+1,imid+i+1,n-i-1);
		return p;
	}
	BiTree<T> *Copy(BiNode<T> *p)
	{
		if(p==NULL)
			return NULL;
		BiNode<T> *newp = new BiNode<T>;
		newp->data = p->data;
		newp->lchild = Copy(p->lchild);
		newp->rchild = Copy(p->rchild);
		return newp;
	}
	int Count(BiNode<T> *p)
	{
		if(p==NULL)
			return 0;
		int left=Count(p->lchild);
		int right=Count(p->rchild);
		return 1+left+right;
	}
	int Count0(BiNode<T> *p)
	{
		if(p==NULL)
			return 0;
		return (p->lchild==NULL&&p->rchild==NULL)+Count0(p->lchild)+Count0(p->rchild);
	}
	int Count2(BiNode<T> *p)
	{
		if(p==NULL)
			return 0;
		return (p->lchild!=NULL&&p->rchild!=NULL)+Count2(p->lchild)+Count2(p->rchild);
	}
	int Count1(BiNode<T> *p)
	{
		if(p==NULL)
			return 0;
		return ((p->lchild==NULL&&p->rchild!=NULL)||(p->lchild!=NULL&&p->rchild==NULL))+Count1(p->lchild)+Count1(p->rchild);
	}
	int High(BiNode<T> *p)
	{
		if(p==NULL)
			return 0;
		return High(p->lchild)>High(p->rchild)?1+High(p->lchild):1+High(p->rchild);
	}
	BiNode<T> * Search(BiNode<T>*p , T &e)
	{
		if(p==NULL)
			return NULL;
		if(p->data==e)
			return p;
		BiNode<T> *q=Search(p->lchild,e);
		if(q!=NULL)
			return q;
		return Search(p->rchild,e);
	}
	BiNode<T> *SearchParent(BiNode<T> *p,BiNode<T> *child)
	{
		if(p==NULL)
			return NULL;
		if(p->lchild==child||p->rchild==child)
			return p;
		BiNode<T> *q = SearchParent(p->lchild,child);
		if(q)
			return q;
		return SearchParent(p->rchild,child);
	}
	void InThreaded(BiNode<T> *p)
	{
		if(p==NULL)
			return;
		InThreaded(p->lchild);
		if(p->lchild==NULL)
		{
			p->ltype=THREAD;
			p->lchild=preNode;
		}
		if(p->rchild==NULL)
			p->rtype=THREAD;
		if(preNode!=NULL)
		{
			if(preNode->rtype==THREAD)
			{
				preNode->rchild=p;
			}
		}
		preNode=p;
		InThreaded(p->rchild);
	}
public:
	void InThreaded()
	{
		InThreaded(root);
	}
	int Count0()
	{
		return Count0(root);
	}
	int Count2()
	{
		return Count2(root);
	}
	int Count1()
	{
		return Count1(root);
	}
	int High()
	{
		return High(root);
	}
	int Count()
	{
		return Count(root);
	}
	BiTree()
	{
		root = NULL;
	}
	BiTree(BiTree<T> &tree)
	{
		root=Copy(tree.root);
	}
	BiTree(vector<T> &pre)
	{
		int i=0;
		root = CreateByPre(pre,i);
	}
	BiTree(vector<T> &pre,vector<T> &mid)
	{
		n=pre.size();
		root = CreateByPreMid(pre,mid,0,0,n);
	}
	void PreOrder()
	{
		PreOrder(root);
	}
	void MidOrder()
	{
		MidOrder(root);
	}	
	void AftOrder()
	{
		AftOrder(root);
	}
	BiNode<T> *SearchParent(BiNode<T> *child)
	{
		return SearchParent(root,child);
	}
	BiNode<T> *Search(T &e)
	{
		return Search(root,e);
	}
	BiNode<T> *GetNext(BiNode<T> *p)
	{
		if(p->rtype==THREAD)
			return p->rchild;
		p=p->rchild;
		while(p->ltype==LINK)
			p=p->lchild;
		return p;
	}
	BiNode<T> *GetBefore(BiNode<T> *p)
	{
		if(p->ltype==THREAD)
			return p->lchild;
		p=p->lchild;
		while(p->rtype==LINK)
			p=p->rchild;
		return p;
	}
	void Travese()
	{
		BiNode<T> *p=root;
		while(p->ltype==LINK)
			p=p->lchild;
		while(p!=NULL)
		{
			cout<<p->data<<" ";
			p=GetNext(p);
		}
	}
	BiNode<T> *GetParent(BiNode<T> *p)
	{
		if(p==NULL)
			return NULL;
		BiNode<T> *parent;
		parent=p;
		while(parent->rtype==LINK)
			parent=parent->rchild;
		parent=parent->rchild;
		if(parent&&parent->lchild==p)
			return parent;	
		parent = p;
		while(parent->ltype==LINK)
			parent=parent->lchild;
		return parent;
	}
};

main.cpp

#include<iostream>
#include"BiTree.h"
using namespace std;
int main()
{
	vector<char> M;
	M.push_back('1');
	M.push_back('2');
	M.push_back('3');
	M.push_back('*');
	M.push_back('*');
	M.push_back('4');
	M.push_back('*');
	M.push_back('*');
	M.push_back('5');
	M.push_back('6');
	M.push_back('*');
	M.push_back('*');
	M.push_back('*');

	BiTree<char> TREE(M);
	TREE.InThreaded();
	TREE.Travese();

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈笑死哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值