C++层次遍历创建完全二叉树及四种遍历输出

//BinTreeNode.h
/*节点类的定义*/
#include<iostream>
using namespace std;
template<class T>
class BinTreeNode {
public:
	T data;
	BinTreeNode<T> *leftChild, *rightChild;
	BinTreeNode() : //构造方法
			leftChild(NULL), rightChild(NULL) {
	}
	BinTreeNode(T x) { //重载构造方法
		leftChild = NULL;
		rightChild = NULL;
		data = x;
	}
	BinTreeNode(T x, BinTreeNode<T> *l = NULL, BinTreeNode<T> *r = NULL) : //重载构造方法
			data(x), leftChild(l), rightChild(r) {
	}

};

/*树的定义*/
Tree.h
#include <iostream>
#include "BinTreeNode.h"
#include <queue>
using namespace std;
template<class T>
class BinaryTree {

public:
	friend class BinTreeNode<T> ;
	BinaryTree(); //构造方法
	BinaryTree(T value); //重载构造方法
	~BinaryTree(); //析构方法
	BinTreeNode<T>* CreateBinaryTree(); //前序遍历创建二叉树,输入0结尾,由PreOrderCreate调用
	BinTreeNode<T> *CreateByPreIn(T *VLR, T*LVR, int n); //利用前序遍历和中序遍历创建二叉树
	void LevelCreateTree(int a); //层次遍历创建完全二叉树
	void PreOrderCreate(); //调用CreateBinaryTree创建二叉树
	void CreateByPI(int); //调用CreateByPreIn创建二叉树
	bool isEmpty(); //判断是否为空
	void inOrder(BinTreeNode<T> *p); //中序遍历
	void preOrder(BinTreeNode<T> *p); //前序遍历
	void postOrder(BinTreeNode<T> *p); //后序遍历
	void visit(BinTreeNode<T> *p); //访问输出
	BinTreeNode<T> *Parent(BinTreeNode<T> *current); //获得父节点
	BinTreeNode<T> *LeftChild(BinTreeNode<T> *current); //获得左子节点
	BinTreeNode<T> *RightChild(BinTreeNode<T> *current); //获得右子节点
	BinTreeNode<T> *getRoot() const; //获得根节点
	int Height(); //返回二叉树高度
	int Size(); //返回二叉树节点数
	int max(int, int); //辅助方法,求大值
	int TreeHeight(BinTreeNode<T> *root); //计算树高度,由Height调用
	int getSize(BinTreeNode<T> *p); //计算节点数,由Size调用
	void levelOrder(BinTreeNode<T> *p); //层次遍历
	void Traverse(BinTreeNode<T> *subTree, ostream& out); //输出
	void destroy(BinTreeNode<T> *subTree); //销毁
protected:

	T RefValue;
	BinTreeNode<T> *root;
	friend ostream& operator <<(ostream& out, BinaryTree<T> *Tree) { //运算符重载
		out << "前序遍历输出" << endl;
		Tree->Traverse(Tree->root, out);
		out << endl;
		return out;

	}

};
template<class T>
BinaryTree<T>::BinaryTree() {
	root = NULL;
}

template<class T>
BinaryTree<T>::BinaryTree(T value) {
	root->data = value;
}
template<class T>
BinaryTree<T>::~BinaryTree() {
	destroy(root);
}
template<class T>
void BinaryTree<T>::visit(BinTreeNode<T> *p) {
	cout << p->data << " ";
}
template<class T>
BinTreeNode<T> * BinaryTree<T>::CreateBinaryTree() {
	BinTreeNode<T> *nodeP = new BinTreeNode<T>;
	T data;
	cin >> data;
	if (data == '0') {
		nodeP = NULL;
	} else {
		nodeP->data = data;
		cout << "请输入" << nodeP->data << "的左节点" << endl;
		nodeP->leftChild = CreateBinaryTree();
		cout << "请输入" << nodeP->data << "的右节点" << endl;
		nodeP->rightChild = CreateBinaryTree();
	}

	return nodeP;
}

template<class T>
void BinaryTree<T>::destroy(BinTreeNode<T> *subTree) {
	if (subTree != NULL) {
		destroy(subTree->leftChild);
		destroy(subTree->rightChild);
		delete subTree;
	}
}
template<class T>
void BinaryTree<T>::LevelCreateTree(int a) {
	queue<BinTreeNode<T>*> *que = new queue<BinTreeNode<T>*>;
	int count = 1;
	BinTreeNode<T> *node = new BinTreeNode<T>;
	root = new BinTreeNode<T>;
	node = root;
	cin >> root->data;
	que->push(node);
	while (!que->empty()) {
		node = que->front();
		que->pop();
		if (node->leftChild == NULL) {
			BinTreeNode<T> *l = new BinTreeNode<T>;
			cin >> l->data;
			node->leftChild = l;
			que->push(l);
			count++;
			if (count == a)
				break;
		}
		if (node->rightChild == NULL) {
			BinTreeNode<T> *r = new BinTreeNode<T>;
			cin >> r->data;
			node->rightChild = r;
			que->push(r);
			count++;
			if (count == a)
				break;
		}
	}
}

template<class T>
int BinaryTree<T>::max(int m, int n) {
	if (m > n)
		return m;
	else
		return n;
}

template<class T>
int BinaryTree<T>::Size() {

	return getSize(root);

}

template<class T>
void BinaryTree<T>::Traverse(BinTreeNode<T> *subTree, ostream &out) {
	if (subTree != NULL) {
		out << subTree->data << " ";
		Traverse(subTree->leftChild, out);
		Traverse(subTree->rightChild, out);
	}
}

template<class T>
BinTreeNode<T> *BinaryTree<T>::LeftChild(BinTreeNode<T> *current) {
	return (current != NULL) ? current->leftChild : NULL;
}

template<class T>
void BinaryTree<T>::preOrder(BinTreeNode<T> *p) {
	if (p != NULL) {
		cout << p->data << " ";
		preOrder(p->leftChild);
		preOrder(p->rightChild);
	}
}
template<class T>
void BinaryTree<T>::postOrder(BinTreeNode<T> *p) {
	if (p != NULL) {
		postOrder(p->leftChild);
		postOrder(p->rightChild);
		cout << p->data << " ";
	}
}
template<class T>
int BinaryTree<T>::Height() {
	return TreeHeight(root);
}

template<class T>
void BinaryTree<T>::PreOrderCreate() {
	cout << "请输入根节点" << endl;
	root = CreateBinaryTree();
}

template<class T>
void BinaryTree<T>::inOrder(BinTreeNode<T> *p) {
	if (p != NULL) {
		inOrder(p->leftChild);
		cout << p->data << " ";
		inOrder(p->rightChild);
	}
}

template<class T>
BinTreeNode<T> *BinaryTree<T>::getRoot() const {
	return root;
}

template<class T>
bool BinaryTree<T>::isEmpty() {
	return root == NULL;
}

template<class T>
void BinaryTree<T>::CreateByPI(int n) {
	T *a = new T[n];
	T *b = new T[n];
	int i = 0;
	cout<<"请再输入前序序列:"<<endl;
	for (i = 0; i < n; i++) {
		cin >> a[i];
	}
	cout<<"请再输入中序序列:"<<endl;
	for (i = 0; i < n; i++) {
		cin >> b[i];
	}
	root = CreateByPreIn(a, b, n);
}

template<class T>
int BinaryTree<T>::getSize(BinTreeNode<T> *p) {
	int con = 0;
	if (p != NULL) {
		con++;
		con += getSize(p->leftChild);
		con += getSize(p->rightChild);
	}
	return con;
}

template<class T>
BinTreeNode<T> *BinaryTree<T>::RightChild(BinTreeNode<T> *current) {
	return (current != NULL) ? current->rightChild : NULL;
}

template<class T>
int BinaryTree<T>::TreeHeight(BinTreeNode<T> *root) {
	if (root == NULL
	)
		return 0;
	else
		return 1
				+ max(TreeHeight(root->leftChild), TreeHeight(root->rightChild));
}

template<class T>
void postOrder(BinTreeNode<T> *p) {
	if (p != NULL) {
		postOrder(p->leftChild);
		postOrder(p->rightChild);
		cout << p->data << " ";

	}
}

template<class T>
BinTreeNode<T> *BinaryTree<T>::CreateByPreIn(T *VLR, T *LVR, int n) {
	if (n == 0)
		return NULL;
	int k = 0;
	while (VLR[0] != LVR[k])
		k++;
	BinTreeNode<T> *t = new BinTreeNode<T>();
	t->data = VLR[0];
	t->leftChild = CreateByPreIn(VLR + 1, LVR, k);
	t->rightChild = CreateByPreIn(VLR + k + 1, LVR + k + 1, n - k - 1);
	return t;
}

template<class T>
void BinaryTree<T>::levelOrder(BinTreeNode<T> *p) {
	queue<BinTreeNode<T>*> *Q = new queue<BinTreeNode<T>*>;
	p = root;
	Q->push(p);
	while (!Q->empty()) {
		p = Q->front();
		Q->pop();
		cout << p->data << " ";
		if (p->leftChild != NULL
		)
			Q->push(p->leftChild);
		if (p->rightChild != NULL
		)
			Q->push(p->rightChild);
	}

}


/*测试运行*/
#include "Tree.h"
#include <iostream>
using namespace std;

int main() {
	cout << "请输入要创建二叉树的节点数" << endl;
	int a;
	cin >> a;
	cout << "请按照节点顺序输入" << a << "个二叉树数据" << endl;
	BinaryTree<char> *tree = new BinaryTree<char>;
	tree->LevelCreateTree(a);
	cout << "前序遍历输出:" << endl;
	tree->preOrder(tree->getRoot());
	cout << endl << "中序遍历输出:" << endl;
	tree->inOrder(tree->getRoot());
	cout << endl << "后序遍历输出:" << endl;
	tree->postOrder(tree->getRoot());
	cout << endl << "层次遍历输出:" << endl;
	tree->levelOrder(tree->getRoot());
	cout << endl << "二叉树的高度:" << endl;
	cout << tree->Height() << endl;
	cout << "二叉树的节点数:" << endl;
	cout << tree->Size() << endl;
	cout << "请输入某一二叉树的前序序列和中序序列" << endl;
	cout << "请先输入节点个数:" << endl;
	int x = 0;
	cin >> x;
	tree->CreateByPI(x);
	cout << "前序遍历输出:" << endl;
	tree->preOrder(tree->getRoot());
	cout << endl << "中序遍历输出:" << endl;
	tree->inOrder(tree->getRoot());
	cout << endl << "后序遍历输出:" << endl;
	tree->postOrder(tree->getRoot());
	cout << endl << "层次遍历输出:" << endl;
	tree->levelOrder(tree->getRoot());
	cout << endl << "二叉树的高度:" << endl;
	cout << tree->Height() << endl;
	cout << "二叉树的节点数:" << endl;
	cout << tree->Size() << endl;
	return 0;
}


/*
测试结果:

请输入要创建二叉树的节点数
6
请按照节点顺序输入6个二叉树数据
5 7 6 3 8 9
前序遍历输出:
5 7 3 8 6 9 
中序遍历输出:
3 7 8 5 9 6 
后序遍历输出:
3 8 7 9 6 5 
层次遍历输出:
5 7 6 3 8 9 
二叉树的高度:
3
二叉树的节点数:
6
请输入某一二叉树的前序序列和中序序列
请先输入节点个数:
9
请再输入前序序列:
A B H F D E C K G
请再输入中序序列:
H B D F A E K C G
前序遍历输出:
A B H F D E C K G 
中序遍历输出:
H B D F A E K C G 
后序遍历输出:
H D F B K G C E A 
层次遍历输出:
A B E H F C D K G 
二叉树的高度:
4
二叉树的节点数:
9
*/


  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值