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