C++数据结构 二叉树模板
·
#include<iostream>
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);//后序遍历
public:
Tree();
Tree(int maxNodes);
~Tree();
TreeNode<T>* GetTreeNode(int id);//通过id获取到结点对应的地址
void CreateTree(T a[], int size, T nullNode);//创建树
void preOrderTraversal();//前序遍历
void inOrderTraversal();//中序遍历
void postOrderTraversal();//后序遍历
};
template<typename T>
Tree<T>::Tree() {
nodeSize = 100001;
nodes = new TreeNode<T>[nodeSize];
}
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];
}
//为了方便调试,定义一个visit打印
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) {
//如果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) {
inOrder(node->left);
inOrder(node->right);
visit(node);
}
}
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>* newNode = GetTreeNode(nodeId);
newNode->val = a[nodeId];
newNode->left = Create(a, size, nodeId * 2, nullNode);
newNode->right = Create(a, size, nodeId * 2 + 1, nullNode);
return newNode;
}
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>::preOrderTraversal() {
preOrder(root);
}
template<typename T>
void Tree<T>::inOrderTraversal() {
inOrder(root);
}
template<typename T>
void Tree<T>::postOrderTraversal() {
postOrder(root);
}
int main() {
const char nullNode = '-';
char a[16] = {
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.preOrderTraversal();
cout << endl;
T.inOrderTraversal();
cout << endl;
T.postOrderTraversal();
cout << endl;
return 0;
}
更多推荐



所有评论(0)