二叉树的课堂代码

二叉树的课堂代码

#include "iostream"
#include "assert.h"
using namespace std;
template <class 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 <class T>
class BinaryTree {        //二叉树类定义
public:
    BinaryTree() : root(NULL) { }      //构造函数
    BinaryTree(T value) : RefValue(value), root(NULL) { }  //构造函数
    BinaryTree(BinaryTree<T>& s)     //复制构造函数
    {
        if (this != &s)
            this->root = CopyTree(s.root);
    }
    ~BinaryTree() { destroy(root); }      //析构函数
    bool IsEmpty() { return root == NULL; } //判二叉树空否
    int Height() { return Height(root); }  //求树高度
    int Size() { return Size(root); }        //求结点数
    BinTreeNode<T> *Parent(BinTreeNode <T> *t) //返回双亲结点
    {
        return (root == NULL || root == t) ? NULL : Parent(root, t);
    }
    BinTreeNode<T> *LeftChild(BinTreeNode<T> *t)
    {
        return (t != NULL) ? t->leftChild : NULL;
    } //返回左子女
    BinTreeNode<T> *RightChild(BinTreeNode<T> *t)
    {
        return (t != NULL) ? t->rightChild : NULL;
    } //返回右子女
    BinTreeNode<T> *getRoot() const { return root; } //取根´
    void levelOrder();    //层次序遍历
    void PreOrder()
    {
        PreOrder(root);
    }
    void InOrder()
    {
        InOrder(root);
    }
    void PostOrder()
    {
        PostOrder(root);
    }
    void CreateBinTree() { CreateBinTree(root); };
    void setRefValue(T x) { RefValue = x; }
    BinTreeNode<T>* CopyTree(BinTreeNode<T>*s);
    
protected:
    BinTreeNode<T> *root;     //二叉树的根指针
    T RefValue;        //数据输入停止标志
    void PreOrder(BinTreeNode<T> *subTree); //前序遍历
    void InOrder(BinTreeNode<T> *subTree);  //中序遍历
    void PostOrder(BinTreeNode<T> *Tree);//
    void CreateBinTree(BinTreeNode<T> *&Tree);//建树
    void destroy(BinTreeNode<T> *& subTree); //删除
    int Height(BinTreeNode<T> *subTree)const;     //返回树高度
    int Size(BinTreeNode<T> *subTree)const;     //返回结点数
};
template<class T>
void BinaryTree<T>::destroy(BinTreeNode<T> *& subTree)
{
    if (subTree != NULL)
    {
        destroy(subTree->leftChild);
        destroy(subTree->rightChild);
        delete subTree;
    }
}
template<class T>
BinTreeNode<T>* BinaryTree<T>::CopyTree(BinTreeNode<T>*s)
{
    BinTreeNode<T>*temp = NULL;
    if (s == NULL)
    {
        temp = NULL;
    }
    else
    {
        temp = new BinTreeNode<T>(s->data);
        if (s->leftChild)temp->leftChild = CopyTree(s->leftChild);
        if (s->rightChild)temp->rightChild = CopyTree(s->rightChild);
    }
    return temp;
}

template <class T>
void BinaryTree<T>::PreOrder(BinTreeNode<T> *subTree)
{
    if (subTree != NULL) {
        cout << subTree->data << "  ";;
        PreOrder(subTree->leftChild);
        PreOrder(subTree->rightChild);
    }
}
template <class T>
void BinaryTree<T>::InOrder(BinTreeNode<T> * subTree)
{
    if (subTree != NULL) {
        InOrder(subTree->leftChild);
        cout << subTree->data << "  ";
        InOrder(subTree->rightChild);
    }
}
template <class T>
void BinaryTree<T>::PostOrder(BinTreeNode<T> * subTree)
{
    if (subTree != NULL) {
        PostOrder(subTree->leftChild);
        PostOrder(subTree->rightChild);
        cout << subTree->data << "  ";;
    }
}
template<class T>
void BinaryTree<T>::CreateBinTree(BinTreeNode<T>*&subTree)
{
    T item;
    cin >> item;
    if (item != RefValue)
    {
        subTree = new BinTreeNode<T>(item);
        if (subTree == NULL)
        {
            cerr << "存储分配错!" << endl;  exit(1);
        }
        CreateBinTree(subTree->leftChild);
        CreateBinTree(subTree->rightChild);
    }
    else subTree = NULL;
}

template <class T>
int BinaryTree<T>::Size(BinTreeNode<T> *  subTree) const {
    if (subTree == NULL) return 0;
    else return 1 + Size(subTree->leftChild) + Size(subTree->rightChild);
};
template <class T>
int  BinaryTree<T>::Height(BinTreeNode<T> *  subTree) const
{
    if (subTree == NULL) return 0;
    else {
        int i = Height(subTree->leftChild);
        int j = Height(subTree->rightChild);
        return (i < j) ? j + 1 : i + 1;
    }
}

int main()
{
    BinaryTree<int> root, root1;
    root.setRefValue(0);
    cout << "二叉建立:" << endl;
    root.CreateBinTree();
    cout << "前序遍历输出二叉树:";
    root.PreOrder();
    cout << endl;
    cout << "先序遍历输出二叉树(非递归调用):" << endl;
    cout << "中序遍历输出二叉树:";
    root.InOrder();
    cout << endl;
    cout << "后序遍历输出二叉树:";
    root.PostOrder();
    cout << endl;
    cout << "输出二叉树高度:";
    cout << root.Height() << endl;
    cout << "输出二叉树结点数目:";
    cout << root.Size() << endl;
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值