进击的暑假(六)--二叉树

#include <iostream>
#include <stack>
using namespace std;

template <typename  T>
struct BinTreeNode{
    T data;
    BinTreeNode<T> *leftChild, *rightChild;
    BinTreeNode():leftChild(NULL),rightChild(NULL){}
    BinTreeNode(T x, BinTreeNode<T> *l = NULL, BinTreeNode<T> *r = NULL)
    :data(x), leftChild(l), rightChild(r){}
};

template <typename T>
class BinaryTree{
public:
    BinaryTree():RefValue('#'),root(NULL){}
    BinaryTree(T value):RefValue(value), root(NULL){}
    ~BinaryTree(){destroy(root);}
    void CreateBinaryTree( const char * &str){
        CreateBinaryTree(root,str);
    }
    void PreOrderTraverse()const {
        PreOrderTraverse(root);
    }
    void PreOrderTraverse_1()const {
        PreOrderTraverse_1(root);
    }
    void InOrderTraverse()const {
        InOrderTraverse(root);
    }
    void PostOrderTraverse()const {
        PostOrderTraverse(root);
    }
    int Size()const {
        return Size(root);
    }
    int Height()const{
        return Height(root);
    }
    BinTreeNode<T>* Find(const T key){
        return Find(root, key);
    }
    BinTreeNode<T>* Parent(const T key){
        return Parent(root, key);
    }
public:
    void destroy(BinTreeNode<T>* &subTree);
protected:
    void CreateBinaryTree(BinTreeNode<T> *&R,const char *&str);
    void PreOrderTraverse_1(BinTreeNode<T> *R) const ;
    void PreOrderTraverse(BinTreeNode<T> *R) const ;
    void InOrderTraverse(BinTreeNode<T> *R)const ;
    void PostOrderTraverse(BinTreeNode<T> *R)const;
    int Size(BinTreeNode<T> *R)const;
    int Height(BinTreeNode<T> *R)const;
    BinTreeNode<T>* Find(BinTreeNode<T> *R, const T key)const;
    BinTreeNode<T>* Parent(BinTreeNode<T> *R, const T key)const;
protected:
    BinTreeNode<T> *root;
    T RefValue;
};
template <typename T>
void BinaryTree<T>::CreateBinaryTree(BinTreeNode<T> *&R, const char* &str)
{
    cout<<"create"<<endl;
    //char ch;
    if(*str == RefValue || *str == '\0')
        R = NULL;
    else{
        R = new BinTreeNode<T>(*str);
        CreateBinaryTree(R->leftChild, ++str);
        CreateBinaryTree(R->rightChild, ++str);
    }
}
template <typename T>
void BinaryTree<T>::PreOrderTraverse(BinTreeNode<T> *R)const
{
    if(R){
        cout<<R->data<<" ";
        PreOrderTraverse(R->leftChild);
        PreOrderTraverse(R->rightChild);
    }
}
template <typename T>
void BinaryTree<T>::PreOrderTraverse_1(BinTreeNode<T> * R)const
{
    if(R != NULL)
    {
        stack<BinTreeNode<T>* > St;
        BinTreeNode<T> *p = NULL;
        St.push(R);
        while (!St.empty())
        {
            p = St.top();
            St.pop();
            cout<<p->data<<" ";
            if(p->rightChild != NULL)
                St.push(p->rightChild);
            if(p->leftChild != NULL)
                St.push(p->leftChild);
        }
    }
}
template <typename T>
void BinaryTree<T>::InOrderTraverse(BinTreeNode<T> *R) const
{
    if(R)
    {
        InOrderTraverse(R->leftChild);
        cout<<R->data<<" ";
        InOrderTraverse(R->rightChild);
    }
}
template <typename T>
void BinaryTree<T>::PostOrderTraverse(BinTreeNode<T> *R) const
{
    if(R){
        PostOrderTraverse(R->leftChild);
        PostOrderTraverse(R->rightChild);
        cout<<R->data<<" ";
    }
}
template <typename T>
int BinaryTree<T>::Size(BinTreeNode<T> *R) const
{
    if(R == NULL)
        return 0;
    return Size(R->rightChild) + Size(R->leftChild) + 1;
}
template <typename T>
int BinaryTree<T>::Height(BinTreeNode<T> *R) const
{
    if(R == NULL)
        return 0;
    int left_height = Height(R->leftChild);
    int right_height = Height(R->rightChild);
    return left_height > right_height ? (left_height + 1) : (right_height + 1);
}
template <typename T>
BinTreeNode<T>* BinaryTree<T>::Find(BinTreeNode<T> *R, const T key) const
{
    if(R == NULL)
        return NULL;
    if(R->data == key)
        return R;
    BinTreeNode<T> *q = Find(R->leftChild,key);
    if(q != nullptr)
        return q;
    return Find(R->rightChild,key);
}

template <typename T>
BinTreeNode<T>* BinaryTree<T>::Parent(BinTreeNode<T> *R, const T key) const
{
    BinTreeNode<T>* q = Find(R, key);
    if(q == nullptr ||  q == R)
        return nullptr;
    if(R->leftChild == q || R->rightChild == q)
        return  R;
    else{
        BinTreeNode<T>* p = Parent(R->leftChild, key);
        if(p != nullptr)
            return p;
        return Parent(R->rightChild, key);
    }
}
template <typename T>
void BinaryTree<T>::destroy(BinTreeNode<T> *&subTree)
{
    if(subTree != nullptr)
    {
        destroy(subTree->leftChild);
        destroy(subTree->rightChild);
        delete subTree;
    }
    cout<<"destroy"<<endl;
}

int main()
{
    const char  *str ="abc##d##e#f##";
    BinaryTree<char > my_binarytree;
    my_binarytree.CreateBinaryTree(str);
    /*
    my_binarytree.PreOrderTraverse_1();
    cout<<endl;
    my_binarytree.PreOrderTraverse();
    cout<<endl;
    my_binarytree.InOrderTraverse();
    cout<<endl;
    my_binarytree.PostOrderTraverse();
    */
    //cout<<my_binarytree.Size()<<endl;
    //cout<<my_binarytree.Height()<<endl;
    //BinTreeNode<char >*p =  my_binarytree.Find(('a'));
    //BinTreeNode<char >*q = my_binarytree.Parent('f');
    return 0;
}

中序遍历和后续遍历的非递归写法还没有完善,析构函数也还没有写,存在内存泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值