【源代码】C++数据结构算法(十三)动态查找——二叉排序树

日常说明:有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴最好新建空项目将此代码复制上去。
更多算法请关注我的算法专栏https://blog.csdn.net/column/details/20417.html
运行截图:这里写图片描述
本算法采用比较简单,也比较局限的方法。先用先序遍历建树,然后再进行查找。相对于可输入乱序数字,进行比较插入的方法而言,闲的笨拙。插入法建树也比较容易实现:

template<class T> //模板类
BTree<T>::InsertBST(BNode<T>*q,T e )
{
    if (!SearchBST(T e,q,p))//没有查找成功
    {
        BNode<T>*s = (BTree)malloc(sizeof(BNode));//新结点申请空间
        s->data = e;
        s->lchild = s=>rchild = NULL;//初始化
        if(!p) q = s;
        else if(e>p->data) p->rchild = s;
        else if(e<p->data) p->lchild = s;

    }
}

但是这种插入建树法,也有弊端,就是如果你第一次插入的数据太小,那么会建成一个十分不平衡的树。极端情况下,会出现一条线型的树,时间复杂度和顺序查找一样,那么二叉排序树将变得毫无意义。接下里是我用先序遍历建树的过程,局限性在于,需要将数据排成先序遍历的顺序,也相当的局限,但主要是练习查找的过程,容易测试。
BSTree.h

#pragma once
#include <cstdlib>
#include <iostream>
#define Max 21
using namespace std;

template<class T>
class BTNode
{
public:
    T data;
    BTNode<T> *lchild, *rchild;
    BTNode(T data,BTNode<T> *lchild = NULL,BTNode<T>*rchild = NULL)
    {
        this->data = data;
        this->lchild = lchild;
        this->rchild = rchild;
    }
    /*friend BSTree;*/
};
template<class T>
class BSTree
{
public:
    BTNode<T> *root;//指向根结点
    BSTree();
    BSTree(T Inlist[Max]);//中序建二叉排序树
    BTNode<T>*CreatTree(T Inlist[Max], int&i);
    void SercherBST(BTNode<T>*q, T key, BSTree<T>tree,int list[]);
    /*bool empty();*/
};

BSTree.cpp

#include "BSTree.h"


template<class T>
BSTree<T>::BSTree()
{
    this->root = NULL;
}
template<class T>
BSTree<T>::BSTree(T Inlist[Max])
{
    int i = 0;
    this->root = this->CreatTree(Inlist,i);
}
template<class T>
BTNode<T>*BSTree<T>::CreatTree(T Inlist[Max], int&i)
{
    BTNode<T>*p = NULL;
    if (i<Max)
    {
        T data = Inlist[i];
        i++;
        if (data != NULL)
        {
            p = new BTNode<T>(data);
            p->lchild = CreatTree(Inlist, i);//创建新的结点
            p->rchild = CreatTree(Inlist, i);//递归调用
        }
    }
    return p;
}
//template<class T>
//bool BSTree<T>::empty()
//{
//  return this->root == NULL;
//}
template<class T>
void BSTree<T>::SercherBST(BTNode<T>*q, T key, BSTree<T>tree,int list[])
{
    if (!q)
    {
        q = this->root;
    }
    if (q->data!= NULL &&q->data == key)
    {
        cout<<"在排序二叉树中匹配的数字为:"<<q->data<<endl;
        cout << endl;
    }
    if (q->data != NULL)
    {
        if (q->data < key)
        {
            tree.SercherBST(q->rchild, key, tree,list);
        }
        if (q->data > key)
        {
            tree.SercherBST(q->lchild, key, tree,list);
        }
    }


}

int main()
{
    int list[10] = {3,12,24,37,45,53,61,78,90,100};
    int Inlist[Max] = {45,12,3,NULL,NULL,37,24,NULL,NULL,NULL,53,NULL,100,61,NULL,90,78,NULL,NULL,NULL,NULL };
    BSTree<int>bstree(Inlist);
    BTNode<int>*q = NULL;
    cout << "请输入查找的元素:";
    int key;
    cin >> key;
    bstree.SercherBST(q, key, bstree,list);
    /*cout << "查找到的元素为:" << q->data;*/
    return 0;
}

猜你喜欢

转载自blog.csdn.net/handoking/article/details/80267767