【源代码】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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 代码实现界面化二排序动态查找表的示例: ```cpp #include <iostream> #include <cstdlib> using namespace std; // 定义二排序的节点结构体 struct TreeNode { int value; TreeNode* left; TreeNode* right; }; // 插入节点 void InsertNode(TreeNode*& root, int value) { if (root == NULL) { root = new TreeNode; root->value = value; root->left = NULL; root->right = NULL; } else if (value < root->value) { InsertNode(root->left, value); } else { InsertNode(root->right, value); } } // 查找节点 TreeNode* FindNode(TreeNode* root, int value) { if (root == NULL || root->value == value) { return root; } else if (value < root->value) { return FindNode(root->left, value); } else { return FindNode(root->right, value); } } // 删除节点 void DeleteNode(TreeNode*& root, int value) { if (root == NULL) { return; } else if (value < root->value) { DeleteNode(root->left, value); } else if (value > root->value) { DeleteNode(root->right, value); } else { if (root->left == NULL) { TreeNode* temp = root; root = root->right; delete temp; } else if (root->right == NULL) { TreeNode* temp = root; root = root->left; delete temp; } else { TreeNode* temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->value = temp->value; DeleteNode(root->right, temp->value); } } } // 中序遍历二排序 void InOrderTraversal(TreeNode* root) { if (root != NULL) { InOrderTraversal(root->left); cout << root->value << " "; InOrderTraversal(root->right); } } // 释放二排序内存 void FreeTree(TreeNode* root) { if (root != NULL) { FreeTree(root->left); FreeTree(root->right); delete root; } } int main() { TreeNode* root = NULL; int choice, value; while (true) { cout << "1. 插入节点" << endl; cout << "2. 查找节点" << endl; cout << "3. 删除节点" << endl; cout << "4. 中序遍历" << endl; cout << "5. 退出" << endl; cout << "请选择操作:"; cin >> choice; switch (choice) { case 1: cout << "请输入要插入的元素值:"; cin >> value; InsertNode(root, value); break; case 2: cout << "请输入要查找的元素值:"; cin >> value; if (FindNode(root, value) != NULL) { cout << "元素值 " << value << " 存在于二排序中" << endl; } else { cout << "元素值 " << value << " 不存在于二排序中" << endl; } break; case 3: cout << "请输入要删除的元素值:"; cin >> value; DeleteNode(root, value); break; case 4: cout << "中序遍历结果为:"; InOrderTraversal(root); cout << endl; break; case 5: FreeTree(root); exit(0); default: cout << "无效操作,请重新输入" << endl; break; } } return 0; } ``` 这份代码实现了二排序的插入、查找、删除和中序遍历操作,并提供了一个简单的命令行界面。您可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值