树-C++模板类

 本文为随机树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;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值