树数据结构

Posted cimuhuashuimu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树数据结构相关的知识,希望对你有一定的参考价值。

//树的数据结构表示有三种形式:双亲表示法,孩子表示法,孩子兄弟表示法(可以将树化为二叉树)

//双亲表示法,这里的树结构使用一维数组表示,所以类型为int指向下标
template<class T>
struct pNode {
    T data;
    int parent;
};
//孩子表示法,由于孩子数量不定,采用一维数组与单链表结合的方法
template<class T>
struct cNode {
    int child;
    cNode* next;
};
//孩子兄弟表示法
template<class T>
struct TNode {
    T data;
    TNode<T>* fistchild;
    TNode<T>* rightsib;
};

//二叉树的存储结构可以是一维数组(使用二叉树的性质存储),更多的使用链式结构,分为二叉和三叉链表,二叉链表缺点是不容易找双亲
//二叉树的遍历分为:前序遍历,中序遍历,后序遍历,层序遍历
//二叉树的实现:
template<class T>
struct BiNode {
    T data;
    BiNode* lch;
    BiNode* rch;
};
//各功能在类外实现
template<class T>
class BiTree {
private:
    void Create(BiNode<T>*& R, T data[], int i,int n);
    void Release(BiNode<T>* R);
public:
    BiNode<T>* root;        
    BiTree(T data[],int n);       //构造函数创建一个二叉树
    void PreOrder(BiNode<T>* R);  //前序遍历
    void InOrder(BiNode<T>* R);   //中序遍历
    void PostOrder(BiNode<T>* R);  //后序遍历,
    void LevelOrder(BiNode<T>* R);  //层序遍历
    ~BiTree() {}
};
template<class T>
void BiTree<T>::Create(BiNode<T>*& R, T data[], int i,int n) {
    if (i<=n) {
        R = new BiNode<T>;
        R->data = data[i - 1];
        R->lch = R->rch = NULL;
        Create(R->lch, data, 2 * i,n);
        Create(R->rch, data, 2 * i + 1,n);
    }
}
template<class T>   
BiTree<T>::BiTree(T data[],int n) {
    Create(root, data, 1,n);
};
//前序中序后序递归实现方法只是输出的次序不同, 方式相同,输出在递归前面表示递归时运行,在递归后面表示回溯时运行
template<class T>
void BiTree<T>::PreOrder(BiNode<T>* R) {
    if (R != NULL) {
        cout << R->data << " ";
        PreOrder(R->lch);
        PreOrder(R->rch);
    }
}
template<class T>
void BiTree<T>::InOrder(BiNode<T>* R) {
    if (R != NULL) {
        InOrder(R->lch);
        cout << R->data << " ";
        InOrder(R->rch);
    }
}
template<class T>
void BiTree<T>::PostOrder(BiNode<T>* R) {
    PostOrder(R->lch);
    PostOrder(R->rch);
    cout << R->data << " ";
}
template<class T>
void BiTree<T>::LevelOrder(BiNode<T>* R) {
    BiNode<T>* queue[5];
    int f = 0, r = 0;
    if (R != NULL) {
        queue[++r] = R;
    }
    while (f != r) {
        BiNode<T>* p = queue[++f];
        cout << p -> data;
        if (p->lch != NULL) {
            queue[++r] = p->lch;
        }
        if (p->rch != NULL) {
            queue[++r] = p->rch;
        }
    }
}
template<class T>
void BiTree<T>::Release(BiNode<T>* R) {  //后序遍历删除
    if (R != NULL) {
        Release(R->lch);
        Release(R->rch);
        delete R;
    }
}
template<class T>
BiTree<T>::~BiTree() {
    Release(root);
}

以上是关于树数据结构的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法:树 赫夫曼树

数据结构与算法:树 2-3树,2-3-4树,B树 B+树 B*树 (了解)

数据结构 树(下)

数据结构--前缀树(字典树)

数据结构与算法:树 赫夫曼树

数据结构与算法:树 二叉排序树(BST)