C++写二叉树

在代码中都是使用的是递归来遍历二叉树,在这里面的代码中主要测试的是二叉树的插入和遍历insert()和preOrder(),inOrder(),postOrder();

#include<iostream>
using namespace std;
template <class Type> class BinaryTree;
template <class Type> class BinTreeNode {
    friend class BinaryTree<Type>;
public:
    BinTreeNode() :leftChild(NULL), rightChild(NULL) {}
    BinTreeNode(Type item, BinTreeNode<Type> *left = NULL,
        BinTreeNode<Type> *right = NULL) :
        data(item), leftChild(left), rightChild(right) {}
    Type GetData()const { return data; }
    BinTreeNode<Type> *GetLeft()const { return leftChild; }
    BinTreeNode<Type> *GetRight()const { return rightChild; }
    void setData(const Type &item) { data = item; }
    void SetLeft(BinTreeNode <Type>*L) { leftChild = L; }
    void SetRight(BinTreeNode<Type> *R) { rightChild = R; }
private:
    BinTreeNode<Type> *leftChild, *rightChild;
    Type data;

};
template<class Type> class BinaryTree {
public:
    BinaryTree() :root(NULL) {}
    BinaryTree(Type value) :RefValue(value), root(NULL) {}
    virtual ~BinaryTree() { destroy(root); }
    virtual int IsEmpty() {
        return root == NULL ? 1 : 0;
    }
    virtual BinTreeNode<Type> *Parent(BinTreeNode<Type>* current) {
        return root == NULL || root == current ? NULL : Parent(root, current);
    }
    virtual BinTreeNode <Type> *LeftChild(BinTreeNode<Type>*current) {
        return current != NULL ? current->leftChild : NULL;
    }
    virtual BinTreeNode<Type> *RightChild(BinTreeNode<Type> *current) {
        return current != NULL ? current->rightChild : NULL;
    }
    bool Insert(const Type &item);
//  virtual int Find(const Type &item)const;
    BinTreeNode<Type> *GetRoot()const { return root; }
    friend istream & operator >> (istream &in, BinaryTree<Type> &Tree);
    friend ostream & operator << (ostream &out, BinaryTree<Type> &Tree);
public:
    BinTreeNode<Type> *root;
    Type RefValue;
    BinTreeNode<Type> *Parent(BinTreeNode<Type>*start,
        BinTreeNode<Type>*current); 
    void preOrder(BinTreeNode<Type> *current); 
    void inOrder(BinTreeNode<Type> *current);
    void postOrder(BinTreeNode<Type> *current);
    void destroy(BinTreeNode<Type> *current);

};
template<class Type> void BinaryTree<Type>::destroy(BinTreeNode<Type>*current) {
    if (current != NULL) {
        destroy(current->leftChild);
        destroy(current->rightChild);
        delete current;
    }
}
template<class Type> bool BinaryTree<Type>::Insert(const Type &item) {
    if (root == NULL) {
        root = new BinTreeNode<Type>(item);
    }
    else {
        BinTreeNode<Type> *parent = NULL;
        BinTreeNode<Type>  *p = root;
        while (p != NULL) {
            if (item<p->data) {
                parent = p;
                p = p->leftChild;
            }
            else if (item>p->data) {
                parent = p;
                p = p->rightChild;
            }
            else {
                return false;
            }
        }
        if (item<parent->data)
            parent->leftChild = new BinTreeNode<Type>(item);
        else
            parent->rightChild = new BinTreeNode<Type>(item);
    }
    return true;
}
//寻找parent节点
template <class Type> BinTreeNode <Type> * BinaryTree <Type> ::Parent(BinTreeNode
    <Type> * start, BinTreeNode <Type> *current) {
    if (start == NULL) return NULL;
    if (start->leftChild == current ||
        start->rightChild == current)
        return start;
    BinTreeNode <Type> *p;
    if ((p = Parent(start->leftChild, current))
        != NULL) return p;
    else return Parent(start->rightChild, current);
}
//将二叉树输出
template <class Type> void BinaryTree<Type>::preOrder(
    BinTreeNode <Type> *current){

    if (current != NULL) {
        cout << current->data << ' ';
        preOrder(current->leftChild);
        preOrder(current->rightChild);
    }
}
template <class Type> void BinaryTree<Type>::inOrder(BinTreeNode <Type> *current) {

    if (current != NULL) {

        inOrder(current->leftChild);
        cout << current->data << ' ';
        inOrder(current->rightChild);
    }
}
template <class Type> void BinaryTree<Type>::postOrder(BinTreeNode <Type> *current) {

    if (current != NULL) {

        postOrder(current->leftChild);

        postOrder(current->rightChild);
        cout << current->data << ' ';
    }
}

template <class Type> istream & operator >> (istream & in, BinaryTree<Type> &Tree) {
    Type item;
    cout << "构造二叉树 : \n ";
    cout << "输入数据 ( 用 " << Tree.RefValue
        << "结束 ): ";
    in >> item;
    while (item != Tree.RefValue) {
        Tree.Insert(item);
        cout << "输入数据 ( 用 " << Tree.RefValue
            << "结束 ): ";
        in >> item;
    }
    return in;
}
template <class Type> ostream & operator << (ostream &out, BinaryTree<Type> &Tree) {
    out << "二叉树的前序遍历.\n";
    Tree.Traverse(Tree.root, out);
    out << endl;
    return out;
}
int main() {
    BinaryTree<int> BT;
    BT.Insert(4);
    BT.Insert(3);
    BT.Insert(5); 
    BT.Insert(2);
    BT.Insert(6); 
    cout << BT.GetRoot()->GetData() << endl;
    BT.preOrder(BT.GetRoot()); 
    cout << endl;
    BT.inOrder(BT.GetRoot());
    cout << endl;
    BT.postOrder(BT.GetRoot());
    cout << endl;
    getchar();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值