数据结构-查找二叉树

来源:互联网 发布:怎样申请淘宝子账号 编辑:程序博客网 时间:2024/05/22 17:34

查找二叉树:始终满足任一节点的左儿子小于该节点,右儿子大于该节点,

由于其特性,查找二叉树的中序遍历始终为从小到大;

需要注意的是二叉查找树的删除,有2种策略,在删除节点不多时可以采用懒惰删除,即标记该节点删除而非真正的delete,第二种是当删除节点只有一个儿子或则为叶子节点即没有儿子时,可直接删除并将儿子移至该节点,而当删除节点有左右儿子时将其右子树最小的节点移动至该节点,当然这里并非真正的移动而是将目标节点的值赋给他,并删除目标节点,这里选用右子树最小的节点可以保证不破坏查找二叉树的特性,


另外需要掌握的是由中序前序推出后序或则由中序后序推前序


/***********************************************     >  Filename: BST.cpp     >  Author:   Pyt     >  Create:   2017-08-04 11:11:03************************************************/#include <iostream>#include <queue>#include <utility>using namespace std;template<typename T>class BST{public:    BST();    ~BST();    BST(const BST &t);    BST& operator=(const BST &t);    void insert(const T &val);    void remove(const T &val);    void clear();    bool empty() const;    bool contains(const T &val) const;        void inorder();    void levelorder() const;    T findMin() const;    T findMax() const;private:    struct Node{        T val;        Node *left;        Node *right;        Node(T x, Node *l = NULL, Node *r = NULL) : val(x), left(l), right(r){}    };    Node *root;        void insert(const T &val, Node *&t);    void remove(const T &val, Node *&t);    void clear(Node *&t);    bool contains(const T &val, Node *&t) const;    void inorder(Node *&t) const;    Node* copy_tree(Node *t);    Node* findMin(Node *t) const;    Node* findMax(Node *t) const;};/**构造函数****/template<typename T>BST<T>::BST() : root(NULL){}/***析构*****/template<typename T>BST<T>::~BST(){    clear();}/***拷贝赋值****/template<typename T>BST<T>::BST(const BST &t){    root = copy_tree(t.root);}/****赋值重载****/template<typename T>BST<T>& BST<T>::operator=(const BST &t){    if(this != &t)    {        clear();        root = copy_tree(t.root);    }    return *this;}/**插入***/template<typename T>void BST<T>::insert(const T &val){    insert(val, root);}/***删除*****/template<typename T>void BST<T>::remove(const T &val){    remove(val, root);}/****清空查找树****/template<typename T>void BST<T>::clear(){    clear(root);}/***判断树是否为空***/template<typename T>bool BST<T>::empty() const{    return root==NULL;}/****判断是否包含某元素****/template<typename T>bool BST<T>::contains(const T &val) const{    return contains(val, root);}/***中序遍历****/template<typename T>void BST<T>::inorder(){    inorder(root);}/***层序遍历****/template<typename T>void BST<T>::levelorder() const{    int curlevel = 0;    queue<pair<Node*, int>> q;    if(root)      q.push(make_pair(root, 0));    while(!q.empty())    {        pair<Node*, int> tmp = q.front();        q.pop();        if(tmp.second > curlevel)        {            cout << endl;            curlevel = tmp.second;        }        cout << tmp.first->val << " ";        if(tmp.first->left)          q.push(make_pair(tmp.first->left, curlevel+1));        if(tmp.first->right)          q.push(make_pair(tmp.first->right, curlevel+1));    }    cout << endl;}/***获取最小元值****/template<typename T>T BST<T>::findMin() const{    if(root)        return findMin(root)->val;}/****获取最大元值****/template<typename T>T BST<T>::findMax() const{    if(root)        return findMax(root)->val;}/***寻找插入私有函数****/template<typename T>void BST<T>::insert(const T &val, Node *&t){    if(t == NULL)      t = new Node(val);    if(val < t->val)      insert(val, t->left);    else if(val > t->val)      insert(val, t->right);}/****寻找删除私有函数****/template<typename T>void BST<T>::remove(const T &val, Node *&t){    if(t == NULL)      return ;    if(val < t->val)      remove(val, t->left);    else if(val > t->val)      remove(val, t->right);    else    {        if(t->left && t->right)        {            t->val = findMin(t->right)->val;            remove(val, t->right);        }        else{            Node *obj = t;            t = t->left ? t->left : t->right;            delete obj;        }    }}/****清空树私有函数*****/template<typename T>void BST<T>::clear(Node *&t){    if(t)    {        clear(t->left);        clear(t->right);        delete t;    }    t = NULL;}/***查找是否包含元素私有函数****/template<typename T>bool BST<T>::contains(const T &val, Node *&t) const{    if(t == NULL)      return false;    else if(val < t->val)      return contains(val, t->left);    else if(val > t->val)      return contains(val, t->right);    else       return true;}/***中序遍历私有函数****/template<typename T>void BST<T>::inorder(Node *&t) const{    if(t)    {        inorder(t->left);        cout << t->val << " ";        inorder(t->right);    }}/****深拷贝树私有函数*****/template<typename T>typename BST<T>::Node* BST<T>::copy_tree(Node *t){    if(t == NULL)      return NULL;    else      return new Node(t->val, copy_tree(t->left), copy_tree(t->right));}/**找到最小节点私有函数***/template<typename T>typename BST<T>::Node* BST<T>::findMin(Node *t) const{    if(t->left == NULL)      return t;    else      return findMin(t->left);}/***找到最大节点私有函数****/template<typename T>typename BST<T>::Node* BST<T>::findMax(Node *t) const{    if(t->right == NULL)      return t;    else      return findMax(t->right);}int main(){    BST<int> a;    a.insert(8), a.insert(6), a.insert(5), a.insert(7), a.insert(3), a.insert(9), a.insert(7);    a.levelorder();    a.remove(6);    a.levelorder();    BST<int> b(a);    b.levelorder();    BST<int> c;    c = a;    c.levelorder();    c.inorder();    cout << endl;    cout << a.findMax() << " " << a.findMin() << endl;    c.clear();    cout << c.empty() << endl;}


原创粉丝点击