#include <iostream>
using namespace std;
template<class T>
struct BinaryTreeNode
{
BinaryTreeNode(const T& data)
:_data(data)
,_Left(NULL)
,_Right(NULL)
{}
T _data;
BinaryTreeNode<T>* _Left;
BinaryTreeNode<T>* _Right;
};
template<class T>
class BinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
BinaryTree()
:_root(NULL)
{}
BinaryTree(const T array[], size_t size, const T& invalid)
{
size_t index = 0;
_CreateTree(_root, array, size ,invalid, index);
}
BinaryTree(const BinaryTree<T>& t)
{
_root = _CopyBinaryTree(t._root);
}
BinaryTree<T>& operator=(const BinaryTree<T>& t)
{
if (this != &t)
{
_Destroy(_root);
_root = _CopyBinaryTree(t._root);
}
return *this;
}
void PreOrder()
{
cout<<"PreOrder: "<<endl;
_PreOrder(_root);
cout<<endl;
}
size_t GetLeafNode()
{
return _GetLeafNode(_root);
}
size_t GetKLevelNode(size_t k)
{
return _GetKLevelNode(_root, k);
}
size_t GetHeight()
{
return _GetHeight(_root);
}
~BinaryTree()
{
_Destroy(_root);
}
private:
void _CreateTree(Node *& root, const T array[], size_t size , const T& invalid, size_t& index)
{
if ((index < size) && (array[index] != invalid))
{
root = new Node(array[index]);
_CreateTree(root->_Left, array, size, invalid, ++index);
_CreateTree(root->_Right, array, size, invalid, ++index);
}
}
Node* _CopyBinaryTree(Node* root)
{
Node* NewNode = NULL;
if (root != NULL)
{
NewNode = new Node(root->_data);
NewNode->_Left = _CopyBinaryTree(root->_Left);
NewNode->_Right = _CopyBinaryTree(root->_Right);
}
return NewNode;
}
void _Destroy(Node*& root)
{
if (root != NULL)
{
_Destroy(root->_Left);
_Destroy(root->_Right);
delete root;
root = NULL;
}
}
void _PreOrder(Node* root)
{
if (root == NULL)
return ;
cout<<root->_data<<" ";
_PreOrder(root->_Left);
_PreOrder(root->_Right);
}
size_t _GetLeafNode(Node* root)
{
if (root == NULL)
{
return 0;
}
if (root->_Left == NULL && root->_Right == NULL)
{
return 1;
}
return (_GetLeafNode(root->_Left) + _GetLeafNode(root->_Right));
}
size_t _GetKLevelNode(Node* root, size_t k)
{
if (root == NULL || k < 1 || k > _GetHeight(root))
return 0;
if (k == 1)
return 1;
size_t leftcount = _GetKLevelNode(root->_Left, k-1);
size_t rightcount = _GetKLevelNode(root->_Right, k-1);
return (leftcount + rightcount);
}
size_t _GetHeight(Node* root)
{
if (root == NULL)
return 0;
if (root->_Left == NULL && root->_Right == NULL)
return 1;
size_t leftheight = _GetHeight(root->_Left);
size_t rightheight = _GetHeight(root->_Right);
return (leftheight > rightheight)?(leftheight+1):(rightheight+1);
}
private:
BinaryTreeNode<T>* _root;
};
int main()
{
const char* ptr = "124###35##6";
BinaryTree<char> t(ptr, strlen(ptr), '#');
BinaryTree<char> t1(t);
BinaryTree<char> t2;
t2 = t;
cout << t.GetLeafNode() << endl;
cout << t.GetKLevelNode(2) << endl;
return 0;
}