前序创建二叉树c++

#include <iostream>
#include <string>
using namespace std;
int index = 0;
string str = "ABDH#K###E##CFI###G#J##"; //#表示结点为NULL


template<class T>
class TreeNode
{
    public:
        T data;
        TreeNode<T> *Lchild, *Rchild;

        TreeNode();
        TreeNode(T e);
};
template<class T>
TreeNode<T>::TreeNode(T e)
{
    data = e;
    Lchild = NULL;
    Rchild = NULL;
}
template<class T>
TreeNode<T>::TreeNode()
{
    Lchild = NULL;
    Rchild = NULL;
}

template<class T>
class LinkTree
{
    public:
        TreeNode<T> *root;

        LinkTree();
        void CreateTree(TreeNode<T> **r);   //前序创建二叉树
        void PreOrderTraverse(TreeNode<T> *r);  //前序遍历
        void MidOrderTraverse(TreeNode<T> *r);  //中序遍历
        void PostOrderTraverse(TreeNode<T> *r); //后序遍历
        void Post_delete(TreeNode<T> **r);       //根据后序遍历的特点可以用于释放内存,保证链树不断裂
        ~LinkTree();
};
template<class T>
LinkTree<T>::~LinkTree()
{
    if(root == NULL)
        return;
    cout << "内存释放顺序:" << endl;
    Post_delete(&root);
    cout << endl;
    cout << "内存释放完毕" << endl;
}
template<class T>
void LinkTree<T>::Post_delete(TreeNode<T> **r)
{
    if(*r == NULL)
        return;
    Post_delete(&(*r)->Lchild);
    Post_delete(&(*r)->Rchild);
    cout << (*r)->data << " ";
    delete *r;
}
template<class T>
void LinkTree<T>::PostOrderTraverse(TreeNode<T> *r)
{
    if(r == NULL)
        return;
    PostOrderTraverse(r->Lchild);
    PostOrderTraverse(r->Rchild);
    cout << r->data << " ";
}
template<class T>
void LinkTree<T>::MidOrderTraverse(TreeNode<T> *r)
{
    if(r == NULL)
        return;
    MidOrderTraverse(r->Lchild);
    cout << r->data << " ";
    MidOrderTraverse(r->Rchild);
}

template<class T>
void LinkTree<T>::PreOrderTraverse(TreeNode<T> *r)
{
    if(r == NULL)
        return;
    cout << r->data << " ";
    PreOrderTraverse(r->Lchild);
    PreOrderTraverse(r->Rchild);
}
template<class T>
void LinkTree<T>::CreateTree(TreeNode<T> **r)   //因根节点本身为指针,取引用后需用双重指针接收,
{                                               //此时*r代表root
    T ch;
    ch = str[index++];  //index的值不会随着递归返回而改变
    if(ch == '#')
        *r = NULL;
    else
    {
        *r = new TreeNode<T>;
        (*r)->data = ch;
        CreateTree(&(*r)->Lchild);
        CreateTree(&(*r)->Rchild);
    }
}
template<class T>
LinkTree<T>::LinkTree()
{
    root = NULL;
}
void test02()
{
    LinkTree<char> tree;
    tree.CreateTree(&tree.root);    //若此处不取引用,则CreateTree函数无法改变针对root操作。
    cout << "前序遍历为:" << endl;
    tree.PreOrderTraverse(tree.root);
    cout << endl;
    cout << "中序遍历为:" << endl;
    tree.MidOrderTraverse(tree.root);
    cout << endl;
    cout << "后序遍历为:" << endl;
    tree.PostOrderTraverse(tree.root);
    cout << endl;
}
int main()
{
    test02();
    system("pause");
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值