數據結構回顧(一)二叉樹的基本操作 (C++實現)

最近聊天時被問到二叉樹的層序遍歷代碼實現,嗯?似乎有點模糊了,趕緊找出本科學習時的實驗代碼回顧一下;發現有些重要代碼在幾次數據遷移中丟失了,雖然這些代碼在現在看來寫的不咋地,但畢竟記錄了當年初學計算機時的點滴。貼一貼以前寫的代碼方便以後的回顧學習吧。

#include<iostream>
#include<string>
using namespace std;

template <class T>
struct BiNode   //二叉樹的結點結構
{
	T data;
	BiNode<T> *lchild, *rchild;
};

template <class T>
class BiTree
{
public:
	BiTree();             //構造函數,初始化一棵二叉樹,其前序序列由鍵盤輸入
	~BiTree(void);         //析構函數,釋放二叉鏈表中各結點的存儲空間
	BiNode<T>* Getroot();  //獲得指向根結點的指針
	void PreOrder(BiNode<T> *root);     //前序遍歷二叉樹
	void InOrder(BiNode<T> *root);      //中序遍歷二叉樹
	void PostOrder(BiNode<T> *root);    //後序遍歷二叉樹
	void LeverOrder(BiNode<T> *root);   //層序遍歷二叉樹
	int Count(BiNode<T>  *r);  //統計節點個數   
	void CountLeaf(BiNode<T> *r, int& count);//統計二叉樹中葉子結點的個數
	int Depth(BiNode<T> *r);//求二叉樹的深度
	
private:
	BiNode<T> *root;         //指向根結點的頭指針
	BiNode<T> *Creat();     //有參構造函數調用
	void Release(BiNode<T> *root);   //析構函數調用 
};

template<class T>
BiTree<T>::BiTree()
{
	this->root = Creat();
}

template<class T>
BiTree<T>::~BiTree(void)
{
	Release(root);
}

template<class T>
BiNode<T>* BiTree<T>::Getroot()
{
	return root;
}

template<class T>
void BiTree<T>::PreOrder(BiNode<T> *root)
{
	if (root == NULL)  return;
	else{
		cout << root->data << " ";
		PreOrder(root->lchild);
		PreOrder(root->rchild);
	}
}

template <class T>
void BiTree<T>::InOrder(BiNode<T> *root)
{
	if (root == NULL)  return;      //遞歸調用的結束條件	          
	else{
		InOrder(root->lchild);    //中序遞歸遍歷root的左子樹
		cout << root->data << " ";    //訪問根結點的數據域
		InOrder(root->rchild);    //中序遞歸遍歷root的右子樹
	}
}
template <class T>
void BiTree<T>::PostOrder(BiNode<T> *root)
{
	if (root == NULL)   return;       //遞歸調用的結束條件
	else{
		PostOrder(root->lchild);    //後序遞歸遍歷root的左子樹
		PostOrder(root->rchild);    //後序遞歸遍歷root的右子樹
		cout << root->data << " ";      //訪問根結點的數據域
	}
}

template <class T>
void BiTree<T>::LeverOrder(BiNode<T> *root)
{
	const int MaxSize = 100;

	int front = 0;
	int rear = 0;  //採用順序隊列,並假定不會發生上溢

	BiNode<T>* Q[MaxSize];
	BiNode<T>* q;

	if (root == NULL) return;
	else{
		Q[rear++] = root;
		while (front != rear)
		{
			q = Q[front++];
			cout << q->data << " ";
			if (q->lchild != NULL)    Q[rear++] = q->lchild;
			if (q->rchild != NULL)    Q[rear++] = q->rchild;
		}
	}
}

template <class T>
BiNode<T>* BiTree<T>::Creat()
{
	BiNode<T>* root;
	T ch;
	cin >> ch;
	if (ch == '*') root = NULL;
	else{
		root = new BiNode<T>;       //生成一個結點
		root->data = ch;
		root->lchild = Creat();    //遞歸建立左子樹
		root->rchild = Creat();    //遞歸建立右子樹
	}
	return root;
}

template<class T>
void BiTree<T>::Release(BiNode<T>* root)
{
	if (root != NULL){
		Release(root->lchild);   //釋放左子樹
		Release(root->rchild);   //釋放右子樹
		delete root;
	}
}
template <class T>
int BiTree<T>::Count(BiNode<T> *r)  //統計節點個數 
{
	//...... 
	static int numsnode=0;
	if (r == NULL)  return numsnode;      //遞歸調用的結束條件	          
	else
	{
		numsnode=Count(r->lchild);    //中序遞歸遍歷root的左子樹		
		numsnode=Count(r->rchild);    //中序遞歸遍歷root的右子樹		
	}
	numsnode++;//節點數自加

}

template <class T>
void BiTree<T>::CountLeaf(BiNode<T> *r,int& count)  //統計二叉樹中葉子結點的個數
{

	//......
	
	if (r == NULL)  return ;      //遞歸調用的結束條件	          
	else
	{
		CountLeaf(r->lchild,count) ;    //中序遞歸遍歷root的左子樹		
		CountLeaf(r->rchild,count) ;    //中序遞歸遍歷root的右子樹		
	}
	if(r->lchild==NULL && r->rchild==NULL)
	{
		count++;//節點自加
	
	}
	
}

template <class T>
int BiTree<T>::Depth(BiNode<T> *r) //求二叉樹的深度
{

	//......
	int left=0,right=0;//計數器
	if(!r)
		return 0;
	if(r->lchild)//若左孩子存在  對左孩子進行計算
	{
		left=this->Depth(r->lchild);
		left++;	
	}	
	if(r->rchild)//若右孩子存在  對右孩子進行計算
	{
		right=this->Depth(r->rchild);
		right++;
	
	}	
	cout<<"left: "<<left<<"right: "<<right<<endl;
	return left>right?left:right;//因此處是子樹深度 

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章