利用二叉链表的二叉树类的定义及实现(c++)

利用二叉链表的二叉树类的定义

#include <iostream>

//二叉树结点类的定义
template <class T>
struct BinTreeNode
{
    T data; //数据域
    BinTreeNode *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(); //构造函数
    BinaryTree(T value); //构造函数
    BinaryTree(BinaryTree<T>& s); //复制构造函数
    ~BinaryTree(); //析构函数
    bool IsEmpty(); //判断二叉树是否为空
    BinTreeNode<T> *Parent(BinTreeNode<T> *current); //返回父结点
    BinTreeNode<T> *LeftChild(BinTreeNode<T> *current); //返回左子女
    BinTreeNode<T> *RightChild(BinTreeNode<T> *current); //返回右子女
    int Height(); //返回树的高度
    int Size(); //返回结点数
    BinTreeNode<T> *getRoot()const; //取根
    void preOrder(void(*visit)(BinTreeNode<T> *p)); //前序遍历
    void inOrder(void(*visit)(BinTreeNode<T> *p)); //中序遍历
    void postOrder(void(*visit)(BinTreeNode<T> *p)); //后序遍历
    void levelOrder(void(*visit)(BinTreeNode<T> *p)); //层次遍历
    int Insert(const T& item); //插入新元素
    BinTreeNode<T> *Find(T& item)const; //搜索
protected:
    BinaryTree<T> *root; //二叉树的根指针
    T RefValue; //数据输入停止标志
    void CreateBinTree(istream& in, BinTreeNode<T> *& subTree); //从文件读入建树
    bool Insert(BinTreeNode<T> *& subTree, const T& x); //插入
    bool destroy(BinTreeNode<T> *& subTree); //删除
    bool Find(BinTreeNode<T> *subTree, const T& x)const; //搜索
    BinTreeNode<T> *Copy(BinTreeNode<T> *orignode); //复制
    int Height(BinTreeNode<T> *subTree); //返回树高度
    int Size(BinTreeNode<T> *subTree); //返回结点数
    BinTreeNode<T> *Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current); //返回父结点
    BinTreeNode<T> *Find(BinTreeNode<T> *subTree, const T& x)const; //搜寻x
    void Traverse(BinTreeNode<T> *subTree, ostream& out); //前序遍历输出
    void preOrder(BinTreeNode<T>& subTree, void(*visit)(BinTreeNode<T> *p)); //前序遍历
    void inOrder(BinTreeNode<T>& subTree, void(*visit)(BinTreeNode<T> *p)); //中序遍历
    void postOrder(BinTreeNode<T>& subTree, void(*visit)(BinTreeNode<T> *p)); //后序遍历
    friend istream& operator >> (istream& in, BinaryTree<T>& Tree); //重载操作:输入
    friend ostream& operator << (ostream out, BinaryTree<T>& Tree); //重载操作:输出
};

部分成员函数的实现

删除destroy

template <class T>
BinaryTree<T>::destroy(BinTreeNode<T> *subTree)
{
    if (subTree != NULL)
    {
        destroy(subTree->leftChild); //递归地删除左子树
        destroy(subTree->rightChild); //递归地删除右子树
        delete subTree; //递归subTreee
    }
};

找父结点

template <class T>
BinTreeNode<T> *BinaryTree<T>::Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current)
{
    if (subTree == NULL) return NULL;
    if (subTree->leftChild == current || subTree->rightChild == current)
        return subTree;  //找到,返回父结点
    BinTreeNode<T> *p;
    if ((p = Parent(subTree->leftChild, current)) != NULL)
        return p;  //递归在左子树中搜索
    else
        return Parent(subTree->rightChild, current);  //递归在右子树中搜索
}

搜索并输出根为subTree的二叉树

template <class T>
void BinaryTree<T>::Traverse(BinTreeNode<T> *subTree, ostream& out)
{
    if (subTree != NULL)
    {
        out << subTree->data << ' ';
        Traverse(subTree->leftChild, out);
        Traverse(subTree->rightChild, out);
    }
}

输入广义表建立二叉树

template <class T>
void BinaryTree<T>::CreateBinTree(istream& in, BinTreeNode<char> *& BT)
{
    Stack<BinTreeNode<char>*> s;
    BT = NULL;
    BinTreeNode<char> *p, *t;
    int k;
    char ch;
    
    in >> ch;
    while (ch != RefValue)
    {
        switch (ch)
        {
        case '(':s.Push(p); k = 1; break;
        case ')':s.Pop(t); break;
        case ',':k = 2; break;
        default:
            p = new BinTreeNode(ch);
            if (BT == NULL) BT = p;
            else if (k == 1)
            {
                s.getTop(t);
                t->leftChild = p;
            }
            else
            {
                s.getTop();
                t->rightChild = p;
            }
        }
        in >> ch;
    }
}

猜你喜欢

转载自www.cnblogs.com/wbyixx/p/9357922.html
今日推荐