二叉樹的模板類實現
阿新 • • 發佈:2018-12-29
二叉樹的定義
二叉樹(Binary Tree)是n>0個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由一個根節點和兩棵不相交的分別被稱為左子樹和右子樹組成。
·不存在度大於2的結點;
·左右子樹是有序的,次序不能任意的顛倒。
二叉樹的連結串列儲存方式
二叉樹的每個結點最多有兩個孩子,所以設計一個數據域和兩個指標域,我們稱為二叉連結串列。
二叉鏈樹的結點定義為
template<typename T>
struct BiTNode
{
T data;
BiTNode<T> *lchild, *rchild;
BiTNode(BiTNode<T >* pl = NULL, BiTNode<T>* pr = NULL)
{
lchild = pl;
rchild = pr;
}
};
為了方便介紹是如何生成一顆二叉樹的,我們先來簡單介紹一下三序遍歷。
①前序遍歷
先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹
前序遍歷:ABDGHCEIF
②中序遍歷
從根節點開始(先不訪問),中序遍歷根節點的左子樹,然後訪問根結點,最後中序遍歷右子樹。
中序遍歷:GDHBAEICF
③後序遍歷
從左到右先葉子結點後根結點的方式遍歷左右子樹,最後訪問根結點。
後序遍歷:GHDBIEFCA
接著看回程式碼
//二叉樹
#ifndef BINARYTREE_H_
#define BINARYTREE_H_
#include <vector>
using namespace std;
template<typename T>
struct BiTNode
{
T data;
BiTNode<T> *lchild, *rchild;
BiTNode(BiTNode<T>* pl = NULL, BiTNode<T>* pr = NULL)
{
lchild = pl;
rchild = pr;
}
};
template <typename T>
class BiTree
{
public:
BiTree();
//建構函式
~BiTree();
//解構函式
void PreOrderTraverse(BiTNode<T>* node);
//前序遍歷
void InOrderTraverse(BiTNode<T>* node);
//中序遍歷
void PostOrderTraverse(BiTNode<T>* node);
//後序遍歷
void PrintNodeTraverse(BiTNode<T>*node);
//層次遍歷
BiTNode<T>* GetRoot();
private:
BiTNode<T> *m_root; //根節點
BiTNode<T> *createBiTree(T x[], int &n); //二叉樹的建立
void Release(BiTNode<T>* root); //二叉樹的刪除
};
template<typename T>
BiTree<T>::BiTree()
{
T ch[100];
cin.getline(ch, 100);
int num = 0;
m_root = createBiTree(ch,num);
}
template<typename T>
BiTree<T>::~BiTree()
{
Release(m_root);
}
template<typename T>
BiTNode<T>* BiTree<T>::createBiTree(T x[], int &n)
{
T ch = x[n];
n++;
if (ch == '#')
{
return NULL;
}
else
{
BiTNode<T> *Node = new BiTNode<T>;
Node->data = ch;
Node->lchild = createBiTree(x,n);
Node->rchild = createBiTree(x,n);
return Node;
}
}
template<class T>
void BiTree<T>::Release(BiTNode<T>* root)
{
if (root != NULL)
{
Release(root->lchild);
Release(root->rchild);
delete root;
}
}
template<class T>
void BiTree<T>::PreOrderTraverse(BiTNode<T>* node)
{
if (node == NULL)
{
return;
}
else
{
cout << node->data;
PreOrderTraverse(node->lchild);
PreOrderTraverse(node->rchild);
}
}
template<class T>
void BiTree<T>::InOrderTraverse(BiTNode<T>* node)
{
if (node == NULL)
{
return;
}
else
{
InOrderTraverse(node->lchild);
cout << node->data;
InOrderTraverse(node->rchild);
}
}
template<class T>
void BiTree<T>::PostOrderTraverse(BiTNode<T>* node)
{
if (node == NULL)
{
return;
}
else
{
PostOrderTraverse(node->lchild);
PostOrderTraverse(node->rchild);
cout << node->data;
}
}
template<class T>
void BiTree<T>::PrintNodeTraverse(BiTNode<T>*node)
{
vector<BiTNode<T>*> vec;
vec.push_back(node);
int cur = 0; //儲存的是之前所以層的結點數
int last = 1; //加上待遍歷層結點數後的總結點數
while (cur<vec.size())
{
last = vec.size(); //重置上一行結點數
while (cur<last) //做幾次是由上一層的結點數決定的
{
cout << vec[cur]->data << " "; // 訪問節點
if (vec[cur]->lchild) // 當前訪問節點的左節點不為空則壓入
vec.push_back(vec[cur]->lchild);
if (vec[cur]->rchild) // 當前訪問節點的右節點不為空則壓入,注意左右節點的訪問順序不能顛倒
vec.push_back(vec[cur]->rchild);
cur++;
}
cout << endl; //當cur=last時說明該層的結點已被遍歷
}
}
template<class T>
BiTNode<T>* BiTree<T>::GetRoot()
{
return m_root;
}
#endif