二叉树及操作c++

//二叉树及操作
#include<iostream>
#include<cstring>
using namespace std;
template<class T>
struct Node1//栈和队列共用结构
{
	T data;
	Node1<T> *next;
};
//栈和队列其实都可以直接调用。
//栈定义
template<class T>
class linkstack
{
	Node1<T> *top;
public:
	linkstack() { top = NULL; }
	~linkstack();
	void push(T x);
	T Top();
	T pop();
	bool empty() { return top == NULL; }
};
template<class T>
linkstack<T>::~linkstack()
{
	Node1<T> *p = top;
	while (p)
	{
		Node1<T> *q;
		q = p;
		p = p->next;
		delete q;
	}
	top = NULL;
}
template<class T>
void linkstack<T>::push(T x)
{
	Node1<T> *p = new Node1<T>;
	p->data = x;
	p->next = top;
	top = p;
}
template<class T>
T linkstack<T>::pop()
{
	if (top == NULL)
	{
		cout << "下溢" << endl;
		exit(1);
	}
	T x;
	Node1<T> *p = top;
	x = p->data;
	top = top->next;
	delete p;
	return x;
}
template<class T>
T linkstack<T>::Top()
{
	if (top == NULL)
	{
		cout << "下溢" << endl;
		exit(1);
	}
	return top->data;
}
template<class T>
//队列定义
class linkque
{
	Node1<T> *front, *rear;//队头指针,队尾指针
public:
	linkque();
	~linkque();
	void enque(T x);
	T deque();
	T getque();
	bool empty();
	void output();
};
template<class T>
linkque<T>::linkque()
{
	Node1<T> *s = new Node1<T>;
	s->next = NULL;
	front = rear = s;
}
template<class T>
linkque<T>::~linkque()
{
	rear = front=NULL;
}
template<class T>
void linkque<T>::enque(T x)//入队
{
	Node1<T> *p = new Node1<T>;
	p->data = x;
	p->next = NULL;
	rear->next = p;
	rear = p;
}
template<class T>
T linkque<T>::deque()//出队
{
	if (rear == front)
	{
		cout << "下溢" << endl;
		exit(1);
	}
	Node1<T> *p = front->next;
	T x = p->data;
	front->next = p->next;
	if (p->next == NULL)
	{
		rear = front;
	}
	delete p;
	return x;
}
template<class T>
T linkque<T>::getque()//返回队头元素
{
	if (rear == front)
	{
		cout << "下溢" << endl;    //即队列为空
		exit(1);
	}
	return front->next->data;
}
template<class T>
bool linkque<T>::empty()//判断是否为空
{
	return front == rear;
}
template<class T>
void linkque<T>::output()//输出队列
{
	Node1<T> *p = front->next;
	while (p != NULL)
	{
		T x = p->data;
		cout << x << " ";
		p = p->next;
	}
	cout << endl;
}

//二叉树
template<class T>
struct Node//二叉树结点
{
	T data;//结点元素
	Node<T> *lchild, *rchild;//左右孩子
};
template<class T>
class bitree
{
private:
	Node<T> * root;
	void pre_Order(Node<T> *t);//前序遍历
	void in_Order(Node<T> *t);//中序遍历
	void post_Order(Node<T> *t);//后序遍历
	void level_Order(Node<T> *t);//层次遍历
	void depthFirstSearch(Node<T> *t);//深度优先搜索
	void breadthFirstSearch(Node<T> *t);//广度优先搜索
	Node<T> *create(char s[], int &pos);
public:
	int length;
	void createBiTree(char s[]);//前序构造二叉树
	void preOrder();//前序
	void inOrder();//中序
	void postOrder();//后序
	void levelOrder();///层次
	void DepthFirstSearch();//深度
	void BreadthFirstSearch();//广度
};
template<class T>
Node<T> *bitree<T>::create(char s[], int &pos)
{
	++pos;
	Node<T> *t;
	if (pos >= length)//判断越界
		return NULL;
	else
	{
		if (s[pos] == '#')
			t = NULL;
		else
		{
			t = new Node<T>;
			t->data = s[pos];
			t->lchild = create(s, pos);
			t->rchild = create(s, pos);
		}
		return t;
	}
}
template<class T>
void bitree<T>::createBiTree(char s[])
{
	length = strlen(s);
	int pos = -1;
	root = create(s, pos);
}
template<class T>
void bitree<T>::preOrder()
{
	cout << "前序遍历结果";
	pre_Order(root);
	cout << endl;
}
template<class T>
void bitree<T>::pre_Order(Node<T> *t)
{
	if (t != NULL)
	{
		cout << t->data << " ";
		pre_Order(t->lchild);
		pre_Order(t->rchild);
	}
}
template<class T>
void bitree<T>::inOrder()
{
	cout << "中序遍历结果";
	in_Order(root);
	cout << endl;
}
template<class T>
void bitree<T>::in_Order(Node<T> *t)
{
	if (t != NULL)
	{
		in_Order(t->lchild);
		cout << t->data << " ";
		in_Order(t->rchild);
	}
}
template<class T>
void bitree<T>::postOrder()
{
	cout << "后序遍历结果";
	post_Order(root);
	cout << endl;
}
template<class T>
void bitree<T>::post_Order(Node<T> *t)
{
	if (t != NULL)
	{
		post_Order(t->lchild);
		post_Order(t->rchild);
		cout << t->data << " ";
	}
}
template<class T>
void bitree<T>::levelOrder()
{
	cout << "层次遍历结果";
	level_Order(root);
	cout << endl;

}
template<class T>
void bitree<T>::level_Order(Node<T> *t)
{
	if (t == NULL)
		exit(1);
	linkque<Node<T>*> a;
	a.enque(t);
	while (!a.empty())
	{
		Node<T> *p;
		p = a.getque();
		a.deque();
		cout << p->data << " ";
		if (p->lchild != NULL)
			a.enque(p->lchild);
		if (p->rchild != NULL)
			a.enque(p->rchild);
	}
}
template<class T>
void bitree<T>::breadthFirstSearch(Node<T> *t)
{
	linkque<Node<T>*> q;
	q.enque(t);
	while (!q.empty())
	{
		Node<T> *node = q.getque();
		cout << node->data << " ";
		q.deque();
		if (node->lchild)
		{
			q.enque(node->lchild);
		}
		if (node->rchild)
		{
			q.enque(node->rchild);
		}
	}
}
template<class T>
void bitree<T>::BreadthFirstSearch()
{
	cout << "广度优先搜索";
	breadthFirstSearch(root);
	cout << endl;
}
template<class T>
void bitree<T>::depthFirstSearch(Node<T> *t)
{
	linkstack<Node<T>*> nodestack;
	nodestack.push(t);
	while (!nodestack.empty())
	{
		Node<T> *node = nodestack.Top();
		cout << node->data << " ";
		nodestack.pop();
		if (node->rchild)
		{
			nodestack.push(node->rchild);
		}
		if (node->lchild)
		{
			nodestack.push(node->lchild);
		}
	}
}
template<class T>
void bitree<T>::DepthFirstSearch()
{
	cout << "深度优先搜索";
	depthFirstSearch(root);
	cout << endl;
}
int main()
{
	char t[20] = "helloworld";
	bitree<char> a;
	a.createBiTree(t);
	a.preOrder();
	a.inOrder();
	a.postOrder();
	a.levelOrder();
	a.BreadthFirstSearch();
	a.DepthFirstSearch();
	system("pause");
	return 0;
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值