一,創建一顆二叉樹
BinTree()
:Root(NULL)
{}
void _BinTree(T* str, size_t size, const T& invalid)
{
size_t index = 0;
Root = _Create(str, size, index, invalid);
}
BinTree(BinTree& bt)
{
Root=CopyBinTree(bt.Root);
}
BinTree<T>& operator=(const BinTree<T>& bt)
{
if (bt == this)
return this;
if (Root)
{
Destroy(this->Root);
Root = BinTree(bt);
}
}
二,二叉樹的拷貝構造函數
BinTree(BinTree& bt)
{
Root=CopyBinTree(bt.Root);
}
pNode CopyBinTree(pNode t)
{
pNode pNewNode = NULL;
if (t)
{
//複製根節點
pNewNode = new Node(t->_data);
//複製根節點的左子樹
if (t->_pleft)
pNewNode->_pleft = CopyBinTree(t->_pleft);
//複製根節點的右子樹
if (t->_pright)
pNewNode->_pright = CopyBinTree(t->_pright);
}
return pNewNode;
}
三,賦值運算符的重載
BinTree<T>& operator=(const BinTree<T>& bt)
{
if (bt == this)
return this;
if (Root)
{
Destroy(this->Root);
Root = BinTree(bt);
}
}
void Destroy(pNode root)
{
if (root)
{
Destroy(root->_pleft);
Destroy(root->_pright);
delete root;
}
}
四,前序,中序,後序遍歷
void PreOrder()
{
_PreOrder(Root);
}
void InOrder()
{
_InOrder(Root);
}
void PostOrder()
{
_PostOrder(Root);
}
void _PreOrder(pNode root)
{
if (root)
{
cout << root->_data << " ";
_PreOrder(root->_pleft);
_PreOrder(root->_pright);
}
}
void _InOrder(pNode root)
{
if (root)
{
_InOrder(root->_pleft);
cout << root->_data << " ";
_InOrder(root->_pright);
}
}
void _PostOrder(pNode root)
{
if (root)
{
_PostOrder(root->_pleft);
_PostOrder(root->_pright);
cout << root->_data << " ";
}
}
五,層序遍歷
void levelOrder()//層序遍歷
{
if (NULL == Root)
return;
queue<pNode> Q;
Q.push(Root);
while (!Q.empty())
{
pNode pCur = Q.front();
cout << pCur->_data << " ";
if (pCur->_pleft)
Q.push(pCur->_pleft);
if (pCur->_pright)
Q.push(pCur->_pright);
Q.pop();
}
}
六,二叉樹的深度
size_t _Depth(Node* root)//二叉樹的深度
{
if (root == NULL)
return 0;
size_t left = _Depth(root->_pleft);
size_t right = _Depth(root->_pright);
return left > right ? left + 1 : right + 1;
}
七,二叉樹中節點的個數
size_t _Size(Node* root)//二叉樹的結點個數
{
if (root == NULL)
return 0;
return _Size(root->_left) + _Size(root->_right) + 1;
}
八,總代碼
#include<string.h>
#include<assert.h>
#include<queue>
#include<iostream>
using namespace std;
template<class T>
struct BinTreeNode
{
BinTreeNode(T& data)
:_pleft(NULL),
_pright(NULL)
, _data(data)
{}
BinTreeNode<T>* _pleft;
BinTreeNode<T>* _pright;
T _data;
};
template<class T>
class BinTree
{
public:
typedef struct BinTreeNode<T> Node;
typedef Node* pNode;
BinTree()
:Root(NULL)
{}
void _BinTree(T* str, size_t size, const T& invalid)
{
size_t index = 0;
Root = _Create(str, size, index, invalid);
}
BinTree(BinTree& bt)
{
Root=CopyBinTree(bt.Root);
}
BinTree<T>& operator=(const BinTree<T>& bt)
{
if (bt == this)
return this;
if (Root)
{
Destroy(this->Root);
Root = BinTree(bt);
}
}
~BinTree()
{
Destroy(Root);
}
void PreOrder()
{
_PreOrder(Root);
}
void InOrder()
{
_InOrder(Root);
}
void PostOrder()
{
_PostOrder(Root);
}
void levelOrder()//層序遍歷
{
if (NULL == Root)
return;
queue<pNode> Q;
Q.push(Root);
while (!Q.empty())
{
pNode pCur = Q.front();
cout << pCur->_data << " ";
if (pCur->_pleft)
Q.push(pCur->_pleft);
if (pCur->_pright)
Q.push(pCur->_pright);
Q.pop();
}
}
size_t _Depth(Node* root)//二叉樹的深度
{
if (root == NULL)
return 0;
size_t left = _Depth(root->_pleft);
size_t right = _Depth(root->_pright);
return left > right ? left + 1 : right + 1;
}
size_t _Size(Node* root)//二叉樹的結點個數
{
if (root == NULL)
return 0;
return _Size(root->_left) + _Size(root->_right) + 1;
}
protected:
Node* _Create(T* a, size_t size, size_t& index, const T& invalid)
{
assert(a);
Node* root = NULL;
while (index < size && a[index] != invalid)
{
root = new Node(a[index]);
root->_pleft = _Create(a, size, ++index, invalid);
root->_pright = _Create(a, size, ++index, invalid);
}
return root;
}
pNode CopyBinTree(pNode t)
{
pNode pNewNode = NULL;
if (t)
{
//複製根節點
pNewNode = new Node(t->_data);
//複製根節點的左子樹
if (t->_pleft)
pNewNode->_pleft = CopyBinTree(t->_pleft);
//複製根節點的右子樹
if (t->_pright)
pNewNode->_pright = CopyBinTree(t->_pright);
}
return pNewNode;
}
void Destroy(pNode root)
{
if (root)
{
Destroy(root->_pleft);
Destroy(root->_pright);
delete root;
}
}
void _PreOrder(pNode root)
{
if (root)
{
cout << root->_data << " ";
_PreOrder(root->_pleft);
_PreOrder(root->_pright);
}
}
void _InOrder(pNode root)
{
if (root)
{
_InOrder(root->_pleft);
cout << root->_data << " ";
_InOrder(root->_pright);
}
}
void _PostOrder(pNode root)
{
if (root)
{
_PostOrder(root->_pleft);
_PostOrder(root->_pright);
cout << root->_data << " ";
}
}
private:
pNode Root;
};
int main(void)
{
char* str = "ABD###CE##F";
BinTree<char> Tree;
Tree._BinTree(str, strlen(str),'#');
BinTree<char> Tree1(Tree);
return 0;
}