二叉树应用-二叉搜索树(数据结构基础 第6周)

问题描述

分析
没啥,自己弄清楚,实现一遍二叉搜索树就好了。可参考:二叉树应用-二叉搜索树类模板的实现(数据结构基础 第6周)
源码

#include <iostream>
#include <vector>
#include <string>
using namespace std;

template <class T>
class BinaryTreeNode  
{
private:
    T  element;                                         //二叉树结点数据域
    BinaryTreeNode<T>*  left;                           //二叉树结点指向左子树的指针
    BinaryTreeNode<T>*  right;                          //二叉树结点指向左子树的指针
public:
    BinaryTreeNode();
    BinaryTreeNode(const T& ele);                       //给定数据的构造函数
    T  value() const;                                   //返回当前结点的数据
    void  setLeftchild(BinaryTreeNode<T>*);             //设置当前结点的左子树
    void  setRightchild(BinaryTreeNode<T>*);            //设置当前结点的右子树
    BinaryTreeNode<T>*  leftchild() const;              //返回当前结点指向左子树的指针
    BinaryTreeNode<T>*  rightchild() const;             //返回当前结点指向右子树的指针
};
template <class T>
class BinarySearchTree  
{
private:
    BinaryTreeNode<T>*  root;                               //二叉树根结点指针
    vector<T> elements;  //用于保存遍历的元素
private:
    void Visit(T elem) {elements.push_back(elem);};  //遍历访问元素的值
    void PreOrder(BinaryTreeNode<T>* root); //从root前序遍历二叉树或其子树(递归部分)
    void DeleteBinaryTree(BinaryTreeNode<T>* root);     //递归删除二叉树或其子树 
public:
    BinarySearchTree(){root=NULL;};                               //构造函数
    virtual ~BinarySearchTree(){DeleteBinaryTree(root);};            //析构函数
    void Initialize(BinaryTreeNode<T>* pointer) {root=pointer;};    
    vector<T> traversePreOrder();  //从根节点前序遍历,以下依次对应
    void InsertNode(BinaryTreeNode<T>* newpointer);
};

int main() {
    BinarySearchTree<int> bst;
    int i;
    while(cin>>i) {
        BinaryTreeNode<int> *newpointer=new BinaryTreeNode<int>(i);
        bst.InsertNode(newpointer);
    }
    vector<int> v;
    v=bst.traversePreOrder();
    for (int i=0; i<v.size(); i++) {
        cout << v.at(i) << ' ';
    }
    return 0;
}

/*****************BinaryTreeNode类模板的实现************************/
template<class T>
BinaryTreeNode<T>::BinaryTreeNode()
{
    left=right=NULL;
}

template<class T>
BinaryTreeNode<T>::BinaryTreeNode(const T& ele) //给定数据的构造函数
{
    element=ele;
    left=right=NULL;
}

template<class T>
T  BinaryTreeNode<T>::value() const
{
    return element; 
}

template<class T>
BinaryTreeNode<T>*  BinaryTreeNode<T>::leftchild() const
{
    return left;                                //返回当前结点指向左子树的指针
}

template<class T>
BinaryTreeNode<T>*  BinaryTreeNode<T>::rightchild() const
{
    return right;                               //返回当前结点指向右子树的指针
}  

template<class T>
void  BinaryTreeNode<T>::setLeftchild(BinaryTreeNode<T>* subroot)//设置当前结点的左子树
{
    left=subroot;
}

template<class T>
void  BinaryTreeNode<T>::setRightchild(BinaryTreeNode<T>* subroot)//设置当前结点的右子树
{
    right=subroot;
}

/*****************BinarySearchTree类模板的实现************************/
template<class T>
void BinarySearchTree<T>::DeleteBinaryTree(BinaryTreeNode<T>* root)       //递归删除二叉树或其子树
{
    if(root)
    {
        DeleteBinaryTree(root->leftchild());
        DeleteBinaryTree(root->rightchild());
        delete root;
    };
};


template<class T>
void BinarySearchTree<T>::PreOrder(BinaryTreeNode<T>* root)               //前序遍历二叉树或其子树
{
    if(root!=NULL)
    {
        Visit(root->value());   
        PreOrder(root->leftchild());            //访问左子树
        PreOrder(root->rightchild());           //访问右子树
    }
};
template<class T>
vector<T> BinarySearchTree<T>::traversePreOrder() 
{
    elements.clear();
    PreOrder(root);
    return elements;
}

template <class T>
void BinarySearchTree<T>::InsertNode(BinaryTreeNode<T>* newpointer)
{
    BinaryTreeNode<T>* pointer=NULL; //初始化 
    if(root==NULL) {
        //用指针newpointer初始化二叉搜索树树根,赋值实现
        Initialize(newpointer);
        return;
    }
    else pointer=root;

    while(1)
    {
        if(newpointer->value()==pointer->value())
            return ;                                    //相等则不用插入
        else if(newpointer->value()<pointer->value())   //作为左子树
        {
            if(pointer->leftchild()==NULL)  {
                pointer->setLeftchild(newpointer);
// pointer->left=newpointer;
                return;
            }
            else    pointer=pointer->leftchild();
        }
        else{                                           //作为右子树
            if(pointer->rightchild()==NULL){
                pointer->setRightchild(newpointer);
// pointer->right=newpointer;
                return;
            }
            else    pointer=pointer->rightchild();
        }
    }
}

你可能感兴趣的:(二叉树应用-二叉搜索树(数据结构基础 第6周))