⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binary.h

📁 二叉树
💻 H
字号:
//老师做的

#include "Queue.h"
template <class T> 
class BinaryTree;
template <class T> 
class BinaryTreeNode {
friend BinaryTree<T>;
friend void InOrder(BinaryTreeNode<T> *t);
friend void PreOrder(BinaryTreeNode<T> *t);
friend void PostOrder(BinaryTreeNode<T> *t);
friend void LevelOrder(BinaryTreeNode<T> *t);
friend void InOrderTranvers(BinaryTreeNode<T> *t);
public:
	BinaryTreeNode(){LeftChild=RightChild=0;}
	BinaryTreeNode(const T& e)
	{
		data=e;
		LeftChild=RightChild=0;
	}
	BinaryTreeNode(const T&e, BinaryTreeNode *l,BinaryTreeNode *r)
	{
		data=e;
		LeftChild=l;
		RightChild=r;
		
	}
private:
	T data;
	BinaryTreeNode<T> *LeftChild;//左子树
	BinaryTreeNode<T> *RightChild;//右子树
};

template <class T>
void PreOrder(BinaryTreeNode<T> *t)
{//对*t进行前序遍历
	if(t){
		cout<<t->data;           //访问根结点
		PreOrder(t->LeftChild);  //前序遍历左子树
		PreOrder(t->RightChild); //前序遍历右子树
	}
	
}
template <class T>
void InOrder(BinaryTreeNode<T> *t)
{//对*t进行中序遍历
	if(t){
		InOrder(t->LeftChild);  //中序遍历左子树
		cout<<t->data;           //访问根结点
		InOrder(t->RightChild); //中序遍历右子树
	}
	
}
template <class T>
void PostOrder(BinaryTreeNode<T> *t)
{//对*t进行后序遍历
	if(t){
		PostOrder(t->LeftChild);  //后序遍历左子树
		PostOrder(t->RightChild); //后序遍历右子树
		cout<<t->data;           //访问根结点
	}
	
}

template <class T>
void LevelOrder(BinaryTreeNode<T> *t)
{//对*t逐层遍历
	BinaryTreeNode<T> *p=t;
	LinkedQueue<BinaryTreeNode<T>*> Q;
	while(p)
	{
		cout<<p->data;//访问p
		//将p的孩子放入队列
		if(p->LeftChild) Q.Add(p->LeftChild);
		if(p->RightChild) Q.Add(p->RightChild);
		
		//访问下一个结点
		if(Q.IsEmpty())
			return;
		else
			Q.Del(p);
	}
}
template <class T>
class BinaryTree
{
public:
	BinaryTree(){root=0;}
	~BinaryTree(){};
	bool IsEmtpy() const
	{ return ((root)?false:true); }
	bool Root(T& x) const;
	void MakeTree(const T& element,BinaryTree<T>& left,BinaryTree<T>& right);
	void BreakTree(T& element,BinaryTree<T>& left,BinaryTree<T>& right);
    void InOrder() {InOrd(root);}
	void PreOrder(){PreOrd(root);}
	void PostOrder() {PostOrd(root);}
	void LevelOrder() {LevelOrd(root);}
	int High(){return Height(root);} 
	int Total(){return TotalCount(root);} //统计结点数
private:
	BinaryTreeNode<T> *root;//根结点指针
	void InOrd(BinaryTreeNode<T> *t);
	void PreOrd(BinaryTreeNode<T> *t);
	void PostOrd(BinaryTreeNode<T> *t);
	void LevelOrd(BinaryTreeNode<T> *t);	
	int Height(BinaryTreeNode<T> *t);
	int TotalCount(BinaryTreeNode<T> *t);//统计结点数
};
template<class T>
bool BinaryTree<T>::Root(T& x) const
{
	if(root){x=root->data; return true;}
	else  return false;
}
template<class T>
void BinaryTree<T>::MakeTree(const T& element,BinaryTree<T>& left,BinaryTree<T>& right)  //递归建立树?
{
	root=new BinaryTreeNode<T>(element,left.root,right.root);
	left.root=right.root=0;
}
template<class T>
void BinaryTree<T>::BreakTree( T& element,BinaryTree<T>& left,BinaryTree<T>& right)
{
	if(!root) {cout<<"no tree node"<<endl; return;}
	element=root->data;
	left.root=root->LeftChild;
	right.root=root->RightChild;
	delete root;
	root=0;
}
template <class T>
void BinaryTree<T>::PreOrd(BinaryTreeNode<T> *t)
{//对*t进行前序遍历
	if(t){
		cout<<t->data;           //访问根结点
		PreOrd(t->LeftChild);  //前序遍历左子树
		PreOrd(t->RightChild); //前序遍历右子树
	}
	
}
template <class T>
void BinaryTree<T>::InOrd(BinaryTreeNode<T> *t)
{//对*t进行中序遍历
	if(t){
		InOrd(t->LeftChild);  //中序遍历左子树
		cout<<t->data;           //访问根结点
		InOrd(t->RightChild); //中序遍历右子树
	}
	
}
template <class T>
void BinaryTree<T>::PostOrd(BinaryTreeNode<T> *t)
{//对*t进行后序遍历
	if(t){
		PostOrd(t->LeftChild);  //后序遍历左子树
		PostOrd(t->RightChild); //后序遍历右子树
		cout<<t->data;           //访问根结点
	}
	
}
template <class T>
void BinaryTree<T>::LevelOrd(BinaryTreeNode<T> *t)
{//对*t逐层遍历
	BinaryTreeNode<T> *p=t;
	Queue<BinaryTreeNode<T>*> Q;
	while(p)
	{
		cout<<p->data;//访问p
		//将p的孩子放入队列
		if(p->LeftChild) Q.Add(p->LeftChild);
		if(p->RightChild) Q.Add(p->RightChild);
		
		//访问下一个结点
		if(Q.IsEmpty())
			return;
		else
			Q.Del(p);
	}
}

template <class T>
int BinaryTree<T>::Height(BinaryTreeNode<T> *t) 
{//返回树*t的高度
	if(!t) return 0;
	int hl=Height(t->LeftChild);
	int hr=Height(t->RightChild);
	if(hl>hr) return ++hl;
	else return ++hr;
}
template <class T>
int BinaryTree<T>::TotalCount(BinaryTreeNode<T> *t) 
{//对*t进行前序遍历,同时记录结点数目
	if(!t)
		return 0;         //记录根结点
        else    
        {   
        	int lc=TotalCount(t->LeftChild);  //左子树结点数
		int rc=TotalCount(t->RightChild); //右子树结点数
		return lc+rc+1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -