zoukankan      html  css  js  c++  java
  • 二叉查找树

     /* 主题:二叉查找树
    * 作者:PhoenixZq
    * 邮箱:zhouqiang312@126.com
    * 开发语言:C++
    * 开发环境:VC++ 6.0

    * 时间:2010.12.10
    */

    代码
    //BinarySearchTree.h
    #ifndef BINARYSEARCHTREE_H
    #define BINARYSEARCHTREE_H
    #include
    <iostream>
    typedef
    int T;
    //template <class T>
    class BinarySearchTree{
    private:
    struct BinaryNode{
    T elem;
    BinaryNode
    *left;
    BinaryNode
    *right;

    BinaryNode(
    const T & theElem,BinaryNode *lt,BinaryNode *rt)
    :elem(theElem),left(lt),right(rt) {}
    };

    public:
    BinaryNode
    *root;
    BinarySearchTree(BinaryNode
    *r = NULL):root(r){}//默认构造函数
    BinarySearchTree(const BinarySearchTree &rhs)//拷贝构造函数
    :root(rhs.root){}
    const BinarySearchTree & operator=(const BinarySearchTree & rhs){
    if(this != &rhs){
    makeEmpty(root);
    root
    = clone(rhs.root);
    }
    return *this;
    }
    ~BinarySearchTree(){
    makeEmpty(root);
    }

    BinaryNode
    * clone(BinaryNode * t)const{
    if(t == NULL)
    return NULL;
    return new BinaryNode(t->elem,clone(t->left),clone(t->right));
    }
    void insert(const T & x,BinaryNode * & t);
    void remove(const T & x,BinaryNode * & t);
    const T findMin(BinaryNode *t)const;
    const T findMax(BinaryNode *t)const;
    bool contains(const T & x,BinaryNode *t)const;
    void makeEmpty(BinaryNode * & t);
    void printTree(BinaryNode *t)const;
    // void makeEmpty();


    /* const T & findMin() const;
    const T & findMax() const;
    bool contains(const T & x) const;
    bool isEmpty() const;
    void printTree() const;
    void makeEmpty();
    void insert(const T & x);
    void remove(const T & x);
    */
    };

    #endif
    代码
    #include "BinarySearchTree.h"
    #include
    <iostream>
    using namespace std;

    void BinarySearchTree::makeEmpty(BinaryNode * & t){
    if(t != NULL){
    makeEmpty(t
    ->left);
    makeEmpty(t
    ->right);
    delete t;
    }
    t
    = NULL;
    }

    bool BinarySearchTree::contains(const T & x,BinaryNode *t)const{
    if(t == NULL) return false;
    else if(x < t->elem)
    return contains(x,t->left);
    else if(x > t->elem)
    return contains(x,t->right);
    else return true;
    }
    //递归findMin
    const T BinarySearchTree::findMin(BinaryNode *t)const{
    if(t == NULL) return NULL;
    if(t->left == NULL) return t->elem;
    return findMin(t->left);
    }
    //非递归findMax
    //template <class T>
    const T BinarySearchTree::findMax(BinaryNode *t)const{
    if(t != NULL)
    while(t->right != NULL)
    t
    = t->right;
    return t->elem;
    }

    //template <class T>
    void BinarySearchTree::insert(const T & x,BinaryNode * & t){
    if(t == NULL)
    t
    = new BinaryNode(x,NULL,NULL);
    else if(x < t->elem)
    insert(x,t
    ->left);
    else if(x > t->elem)
    insert(x,t
    ->right);
    else
    ;
    }

    //template <class T>
    void BinarySearchTree::remove(const T & x,BinaryNode * & t){
    if(t == NULL)
    return ;
    if(x < t->elem)
    remove(x,t
    ->left);
    else if(x > t->elem)
    remove(x,t
    ->right);
    else if(t->left != NULL && t->right != NULL){
    t
    ->elem = findMin(t->right);
    remove(t
    ->elem,t->right);
    }
    else{
    BinaryNode
    *oldNode = t;
    t
    =(t->left != NULL) ? t->left:t->right;
    delete oldNode;
    }
    }

    void BinarySearchTree::printTree(BinaryNode *t)const{
    if(t != NULL){
    printTree(t
    ->left);
    cout
    << t->elem << " ";
    printTree(t
    ->right);
    }
    }

    int main(){
    BinarySearchTree BST;
    T data;
    int choice;
    while(true){
    system(
    "cls");
    cout
    << "\n\n\n ---主界面---\n\n\n";
    cout
    << " 1. 插入操作 2. 删除操作\n";
    cout
    << " 3. 查找操作 4. 寻找最大值\n";
    cout
    << " 5. 寻找最小值 6. 打印树\n";
    cout
    << " 0. 退出\n";
    cout
    << " 请选择操作: ";
    cin
    >> choice;
    switch(choice){
    case 0:
    return 0;
    case 1:
    system(
    "cls");
    cout
    << "请输入要插入的元素: " ;
    cin
    >> data;
    BST.insert(data,BST.root);
    break;
    case 2:
    system(
    "cls");
    cout
    << "请输入要删除的元素: ";
    cin
    >> data;
    BST.remove(data,BST.root);
    break;
    case 3:
    system(
    "cls");
    cout
    << "请输入要查找的元素: ";
    cin
    >> data;
    BST.contains(data,BST.root);
    break;
    case 4:
    system(
    "cls");
    cout
    << "寻找最大值: ";
    BST.findMax(BST.root);
    break;
    case 5:
    system(
    "cls");
    cout
    << "寻找最小值: ";
    BST.findMax(BST.root);
    break;
    case 6:
    system(
    "cls");
    cout
    << "打印出树: ";
    BST.printTree(BST.root);system(
    "pause");break;
    }
    }
    return 0;
    }

    存在问题:

    1.没能把root设置为私有;

    2.插入节点操作之前没有创建二叉树.

  • 相关阅读:
    JavaScript 正则表达式
    git常用命令
    用纯css使内容永远居在页面底部
    Oracle中随机抽取N条记录
    表数据回复到某个时候
    oracle同名存储过程被覆盖后如何恢复(转)
    mybatis+spring+mysql
    定位
    关于js的闭包和复制对象
    idea展示runDashboard的窗口
  • 原文地址:https://www.cnblogs.com/phoenixzq/p/1897122.html
Copyright © 2011-2022 走看看