数据结构实验9.1

二叉树的基本实现

创建二叉树类。二叉树的存储结构使用链表。提供操作:前序遍历、中序遍历、后序遍历、层次遍历、计算二叉树结点数目、计算二叉树高度。
格式
输入格式
第一行为一个数字n (10<=n<=100000),表示有这棵树有n个节点,编号为1~n。
之后n行每行两个数字,第 i 行的两个数字a、b表示编号为 i 的节点的左孩子节点为 a,右孩子节点为 b,-1表示该位置没有节点。
保证数据有效,根节点为1。
输出格式
第一行,n个数字,表示该树的层次遍历。
第二行,n个数字,第i个数字表示以 i 节点为根的子树的节点数目。
第三行,n个数字,第i个数字表示以 i 节点为根的子树的高度。
样例1
输入
5
2 3
4 5
-1 -1
-1 -1
-1 -1
输出
1 2 3 4 5
5 3 1 1 1
3 2 1 1 1
样例2
输入
5
3 2
-1 -1
4 5
-1 -1
-1 -1
输出
1 3 2 4 5
5 1 3 1 1
3 1 2 1 1
样例3
输入
10
2 -1
4 3
6 -1
5 8
9 7
-1 -1
-1 -1
-1 -1
10 -1
-1 -1
输出
1 2 4 3 5 8 6 9 7 10
10 9 2 6 4 1 1 1 2 1
6 5 2 4 3 1 1 1 2 1

Hint
请仔细读题,注意建树过程。

#include<iostream>
using namespace std;
int counts[999999];
int deep[999999];
template<class T>
struct binaryTreeNode
{
   T element;int leaves;
   binaryTreeNode<T> *leftChild,*rightChild;  //左子树和右子树 
};
template<class T>
void erase(binaryTreeNode<T>*& proot)
{
	if(proot!=NULL)
	{
		erase(proot->leftChild);
		erase(proot->rightChild);
		delete proot;
		proot=NULL;
	}
}
template<class T>
class binaryTree{
	public:
	binaryTree(){root=NULL;treeSize=0;}//构造函数 
	~binaryTree(){erase(root);}//析构函数 
	bool empty() const{return treeSize==0;}
	int size() const{return treeSize;}
	binaryTreeNode<T>** rootElement(){return &root;}
	void makeTree(T* elem,int n);
	void preOrder(binaryTreeNode<T>* t);
	void inOrder(binaryTreeNode<T>* t);
	void postOrder(binaryTreeNode<T>* t);
	int treeCount(binaryTreeNode<T> * t);
	void levelOrder();
	int height(binaryTreeNode<T> *t);
	private:
	  binaryTreeNode<T> *root;           
      int treeSize;                     
      static void (*visit)(binaryTreeNode<T>*); 
}; 
template<class T>
void (*binaryTree<T>::visit)(binaryTreeNode<T>*);
template<class T>
int binaryTree<T>::treeCount(binaryTreeNode<T> * t)
{
	int n=0;
	if(t!=NULL)
	{
		n=treeCount(t->leftChild)+treeCount(t->rightChild)+1;
	}
	return n;
}
template<class T>
void binaryTree<T>::makeTree(T* elem,int n)
{
	binaryTreeNode <T>** (array[n/2])={};
    array[0]=&root;
    root=new binaryTreeNode<T>;
	root->element=elem[0];
	root->leftChild=NULL;
	root->rightChild=NULL;
	root->leaves=0;
	for(int i=1;i<n;i++)
	{
		int index=(i-1)/2;
		binaryTreeNode<T>* p=new binaryTreeNode<T>;
		if(elem[i]!=-1)
		{
			p->element=elem[i];
			p->leftChild=NULL;
			p->rightChild=NULL;
			p->leaves=0;
		}
		else
			p=NULL;
		if(i%2!=0)
		{
			(*array[index])->leftChild=p;
			if(p!=NULL)
				array[(p->element)-1]=&((*array[index])->leftChild);
		}
		else
		{
			(*array[index])->rightChild=p;
			if(p!=NULL)
				array[(p->element)-1]=&((*array[index])->rightChild);
		}	
    }
    treeSize=n;
}
template<class T>
void binaryTree<T>::preOrder(binaryTreeNode<T> *t)
{// Preorder traversal.
   if (t != NULL)
   {
   	  counts[(t->element)-1]=treeCount(t);
      deep[(t->element)-1]=height(t);
      //binaryTree<T>::visit(t);
      preOrder(t->leftChild);
      preOrder(t->rightChild);
   }
}
template<class T>
void binaryTree<T>::inOrder(binaryTreeNode<T> *t)
{// Inorder traversal.
   if (t != NULL)
   {
      inOrder(t->leftChild);
      binaryTree<T>::visit(t);
      inOrder(t->rightChild);
   }
}
template<class T>
void binaryTree<T>::postOrder(binaryTreeNode<T> *t)
{// Postorder traversal.
   if (t != NULL)
   {
      postOrder(t->leftChild);
      postOrder(t->rightChild);
      binaryTree<T>::visit(t);
   }
}
template <class T>
void binaryTree<T>::levelOrder()
{// Level-order traversal.
	binaryTreeNode <T>* q[treeSize];
   q[0]=root;
   cout<<q[0]->element<<" ";
   for(int i=1;i<treeSize;i++)//
   {
   		int index=0;
   		while(q[index]==NULL||q[index]->leaves==1)
   		{
   			index++;
		}
   		if(i%2!=0)
   		{
   			q[i]=q[index]->leftChild;
   			if(q[i]!=NULL)
   				cout<<q[i]->element<<" ";
   		}
   		else
   		{
   			q[i]=q[index]->rightChild;
   			q[index]->leaves=1;
   			if(q[i]!=NULL)
   				cout<<q[i]->element<<" ";
		}
   }
}
template <class T>
int binaryTree<T>::height(binaryTreeNode<T> *t)
{// Return height of tree rooted at *t.
   if (t == NULL)
      return 0;                    // empty tree
   int hl = height(t->leftChild);  // height of left
   int hr = height(t->rightChild); // height of right
   if (hl > hr)
      return ++hl;
   else
      return ++hr;
}
int main()
{
    int n;
	cin>>n;
	int *tr=new int[2*n+1];
	binaryTree<int> tre;
	tr[0]=1;
	for(int i=1;i<=(2*n);i++)
	{
		cin>>tr[i];
	}
	tre.makeTree(tr,2*n+1);
	tre.levelOrder();
	cout<<endl;
	binaryTreeNode<int>* node=*tre.rootElement();
	tre.preOrder(node);
	for(int i=0;i<n;i++)
		cout<<counts[i]<<" ";
	cout<<endl;
	for(int i=0;i<n;i++)
		cout<<deep[i]<<" ";	
	return 0;
} 
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值