本文为二叉树C++模板类的“学习”代码,其中含构造、析构、插入、前序、中序‘后序遍历’等等。
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct TreeNode
{
T val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(NULL), right(NULL) {}
TreeNode(T x) : val(x), left(NULL), right(NULL) {}
};
template <typename T>
class Tree
{
private:
TreeNode<T> *nodes;
TreeNode<T> *root;
size_t nodesize;
TreeNode<T> *Create(T a[], int size, int nodeid, T nullnode);
void visit(TreeNode<T> *node);
void preorder(TreeNode<T> *node);
void inorder(TreeNode<T> *node);
void postorder(TreeNode<T> *node);
void levelorder(TreeNode<T> *node);
public:
Tree();
Tree(int maxnodes);
~Tree();
TreeNode<T> *GetTreeNode(int id);
void CreateTree(T a[], int size, T nullnode);
void preorderTree();
void inorderTree();
void postorderTree();
};
template <typename T>
Tree<T>::Tree()
{
nodes = new TreeNode<T>[1000001];
}
template <typename T>
Tree<T>::Tree(int maxnodes)
{
nodes = new TreeNode<T>[maxnodes];
}
template <typename T>
Tree<T>::~Tree()
{
delete[] nodes;
}
template <typename T>
TreeNode<T> *Tree<T>::GetTreeNode(int id)
{
return &nodes[id];
}
template <typename T>
TreeNode<T> *Tree<T>::Create(T a[], int size, int nodeid, T nullnode)
{
if (nodeid >= size || a[nodeid] == nullnode)
{
return NULL;
}
TreeNode<T> *nownode = GetTreeNode(nodeid);
nownode->val = a[nodeid];
nownode->left = Create(a, size, nodeid * 2, nullnode);
nownode->right = Create(a, size, nodeid * 2 + 1, nullnode);
return nownode;
}
template <typename T>
void Tree<T>::visit(TreeNode<T> *node)
{
cout << node->val;
}
template <typename T>
void Tree<T>::preorder(TreeNode<T> *node)
{
if (node)
{
visit(node);
preorder(node->left);
preorder(node->right);
}
}
template <typename T>
void Tree<T>::inorder(TreeNode<T> *node)
{
if (node)
{
inorder(node->left);
visit(node);
inorder(node->right);
}
}
template <typename T>
void Tree<T>::postorder(TreeNode<T> *node)
{
if (node)
{
postorder(node->left);
postorder(node->right);
visit(node);
}
}
template <typename T>
void Tree<T>::CreateTree(T a[], int size, T nullnode)
{
root = Create(a, size, 1, nullnode);
}
template <typename T>
void Tree<T>::preorderTree()
{
preorder(root);
}
template <typename T>
void Tree<T>::inorderTree()
{
inorder(root);
}
template <typename T>
void Tree<T>::postorderTree()
{
postorder(root);
}
int main()
{
const char nullnode = '-';
char a[15] = {
nullnode, 'a', 'b', 'c', 'd',
nullnode, 'e', 'f', 'g', 'h',
nullnode, nullnode, nullnode, nullnode, 'i'};
Tree<char> T[15];
T->CreateTree(a, 15, nullnode);
T->preorderTree();
cout << "\n";
T->inorderTree();
cout << "\n";
T->postorderTree();
cout << "\n";
return 0;
}
结果如下: