C ++实现二叉树及笔试题(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zzb2019/article/details/81569404

二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原来二叉树的过程叫做二叉树的反序列化,给定一颗二叉树的头节点head,并已知二叉树节点值的类型为32位整型,请设计一种二叉树序列化   和反序列化的方案,并用代码实现

#ifndef  _BINARYTREE_H
#define _BINARYTREE_H

#include<iostream>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
template <class T>
#pragma warning (disable:4996)
class BinTreeNode
{
public:
	BinTreeNode() :left(NULL), right(NULL) {}
	BinTreeNode(T v) :left(NULL), right(NULL), data(v) {}
	~BinTreeNode(){}
public:
	T data;
	BinTreeNode<T> *left, *right;
};

template<class T>
class BrinaryTree
{
public:
	BrinaryTree():root(NULL)
	{
		Deserialize();//在构造函数调用反序列化函数在构造对象时候就可以把二叉树创建好
	}
	~BrinaryTree()
	{
		Serialize();//一般在析构函数调用序列号函数来保存调试程序时候创建的二叉树
	}
	void Serialize()
	{
		Serialize(root);
	}
	void Deserialize()
	{
		Deserialize(root);
	}
	void CreateBinTree()
	{
		CreateBinTree(root);
	}
	BinTreeNode<T>* getroot()
	{
		return  root;
	}
	void PreOrder(BinTreeNode<T> *t)const
	{
		if (t != NULL)
		{
			cout << t->data << " ";
			PreOrder(t->left);
			PreOrder(t->right);
		}
	}
protected:
	void Serialize(BinTreeNode<T> *t )
	{
		FILE *fp = fopen("BinTree.txt", "w");
		if (t != NULL)
		{
			stack<BinTreeNode<T> *> st;
			st.push(t);
			BinTreeNode<T> *p;
			while (!st.empty())
			{
				p = st.top();
				st.pop();
				fputc(p->data, fp);
				if (p->right != NULL)
					st.push(p->right);
				else
					fputc('#', fp);
				if (p->left != NULL)
					st.push(p->left);
				else
					fputc('#', fp);
			}
		}
		fclose(fp);
	}
	void Deserialize(BinTreeNode<T> *&t)
	{
		FILE *fp = fopen("BinTree.txt", "r");
		char *ar = (char*)malloc(100);
		memset(ar, 0, 100);
		int i = 0;
		while (!feof(fp))
		{
			ar[i++] = fgetc(fp);
		}
		CreateBinTree(t, ar);
		fclose(fp);
	}
	void CreateBinTree(BinTreeNode<T> *&t,  T *&str)
	{
		if (*str == '#' || *str == '\0')
		{
			t = NULL;
		}
		else
		{
			t = new BinTreeNode<T>(*str);
			CreateBinTree(t->left, ++str);
			CreateBinTree(t->right, ++str);
		}
	}
	void CreateBinTree(BinTreeNode<T> *&t)
	{
		T Item;
		cin >> Item;
		if (Item == '#')
			t = NULL;
		else
		{
			t = new BinTreeNode<T>(Item);
			CreateBinTree(t->left);
			CreateBinTree(t->right);
		}
	}
private:
	BinTreeNode<T> *root;
};

测试主函数

#include"BinaryTree.h"

int main()
{
	BrinaryTree<char> bt;
	//bt.CreateBinTree(); 调用无参数的创建函数手动输入二叉树 在析构函数中会自动保存在txt文件中
	bt.PreOrder(bt.getroot());
}

猜你喜欢

转载自blog.csdn.net/zzb2019/article/details/81569404
今日推荐