本文为随机树C++模板类的“学习”代码,其中含构造、析构、插入、打印等等
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct ListNode
{
T data;
ListNode *next;
ListNode(T d) : data(d), next(NULL) {}
};
template <typename T>
struct TreeNode
{
T data;
ListNode<TreeNode<T> *> *childrenHead;
TreeNode() { childrenHead = NULL; }
void Addchild(TreeNode<T> *node) // 头插插入到childremNode
{ // 加入孩子结点
ListNode<TreeNode<T> *> *childNode = new ListNode<TreeNode<T> *>(node); // 分配空间
if (childrenHead == NULL)
{
childrenHead = childNode;
}
else
{
childNode->next = childrenHead;
childrenHead = childNode;
}
}
};
template <typename T>
class Tree
{
private:
TreeNode<T> *nodes; // 结点
TreeNode<T> *root; // 根
public:
Tree();
Tree(int maxNodes); // 构造
~Tree(); // 析构函数
TreeNode<T> *GetTreeNode(int index); // 通过index获得该节点
void Setroot(int rootid); // 获得根节点
void Addchild(int parentid, int sonid); // 在父与子之间进行链接
void Assigndata(int nodeid, T data); // 对nodeid的结点进行赋值为data
void Print(TreeNode<T> *node = NULL); // 深度优先遍历打印
};
template <typename T>
Tree<T>::Tree()
{
nodes = new TreeNode<T>[10000001];
}
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 index)
{ // 通过index获得该节点
return &nodes[index];
}
template <typename T>
void Tree<T>::Setroot(int id)
{ // 获得根节点
root = GetTreeNode(id);
}
template <typename T>
void Tree<T>::Addchild(int parentid, int sonid)
{ // 在父与子之间进行链接
TreeNode<T> *parent = GetTreeNode(parentid);
TreeNode<T> *son = GetTreeNode(sonid);
parent->Addchild(son);
}
template <typename T>
void Tree<T>::Assigndata(int id, T data)
{ // 对nodeid的结点进行赋值为data
GetTreeNode(id)->data = data;
}
template <typename T>
void Tree<T>::Print(TreeNode<T> *node)
{ // 深度优先遍历打印
if (node == NULL)
{
node = root;
}
cout << node->data;
ListNode<TreeNode<T> *> *tmp = node->childrenHead;
while (tmp)
{
Print(tmp->data);
tmp = tmp->next;
}
}
int main()
{ // 测试样例
Tree<char> T(9);
T.Setroot(0);
T.Assigndata(0, 'a');
T.Assigndata(1, 'b');
T.Assigndata(2, 'c');
T.Assigndata(3, 'd');
T.Assigndata(4, 'e');
T.Assigndata(5, 'f');
T.Assigndata(6, 'g');
T.Assigndata(7, 'h');
T.Assigndata(8, 'l');
T.Addchild(0, 2);
T.Addchild(0, 1);
T.Addchild(1, 3);
T.Addchild(2, 5);
T.Addchild(2, 4);
T.Addchild(3, 8);
T.Addchild(3, 7);
T.Addchild(3, 6);
T.Print();
return 0;
}