实验 二叉排序树

掌握二叉排序树的查找、插入、删除、建立算法的思想及程序实现。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef struct Node{
    Node *ls,*rs;
    int val;
}Node;
typedef struct BSTree{
    Node *root;
    BSTree(){root=NULL;}
public:
    Node* newnode(){
        Node *p=(Node*)malloc(sizeof(Node));
        p->ls=p->rs=NULL;
        return p;
    }
    string Search(int x,Node *a){
        if(a->val==x){
            return " ";
        }
        if(a->val>x) return "0"+Search(x,a->ls);
        return "1"+Search(x,a->rs);
    }
    Node* Insert(int x,Node *a){
        if(a==NULL){
            a=newnode();
            a->val=x;
        }else if(a->val>x){
            a->ls=Insert(x,a->ls);
        }else{
            a->rs=Insert(x,a->rs);
        }
        return a;
    }
    Node* Delete_Search(int x,Node *a){
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序(Binary Search Tree,简称BST)是一种特殊的二,它具有以下性质: 1. 左子上的所有节点的值都小于根节点的值。 2. 右子上的所有节点的值都大于根节点的值。 3. 左右子也分别为二排序。 二排序主要用于实现动态查找,可以高效地插入、删除和查找元素。下面是二排序的实现步骤: 1. 建立二排序: - 如果为空,将新节点作为根节点。 - 如果不为空,从根节点开始,比较新节点的值与当前节点的值的大小关系: - 如果新节点的值小于当前节点的值,将新节点插入到当前节点的左子中。 - 如果新节点的值大于当前节点的值,将新节点插入到当前节点的右子中。 - 如果新节点的值等于当前节点的值,不进行插入操作。 2. 遍历二排序: - 前序遍历:先访问根节点,然后递归地遍历左子和右子。 - 中序遍历:先递归地遍历左子,然后访问根节点,最后递归地遍历右子。 - 后序遍历:先递归地遍历左子和右子,最后访问根节点。 3. 删除节点: - 如果要删除的节点是叶子节点,直接删除即可。 - 如果要删除的节点只有一个子节点,将子节点替换为要删除的节点。 - 如果要删除的节点有两个子节点,可以选择用其前驱节点或后继节点替换。 4. 查找并记录访问次数: - 从根节点开始,比较要查找的值与当前节点的值的大小关系: - 如果要查找的值小于当前节点的值,继续在左子中查找。 - 如果要查找的值大于当前节点的值,继续在右子中查找。 - 如果要查找的值等于当前节点的值,找到了目标节点,并记录访问次数。 5. 利用快速排序的思想将负数排在正数前: - 在建立二排序时,可以将负数插入到左子中,将正数插入到右子中,这样就可以实现负数排在正数前的效果。 以下是一个二排序的示例代码: ```cpp #include <iostream> struct TreeNode { int value; TreeNode* left; TreeNode* right; }; void insert(TreeNode*& root, int value) { if (root == nullptr) { root = new TreeNode; root->value = value; root->left = nullptr; root->right = nullptr; } else if (value < root->value) { insert(root->left, value); } else if (value > root->value) { insert(root->right, value); } } void inorderTraversal(TreeNode* root) { if (root != nullptr) { inorderTraversal(root->left); std::cout << root->value << " "; inorderTraversal(root->right); } } int main() { TreeNode* root = nullptr; // 插入节点 insert(root, 5); insert(root, 3); insert(root, 7); insert(root, 2); insert(root, 4); insert(root, 6); insert(root, 8); // 中序遍历 inorderTraversal(root); // 输出:2 3 4 5 6 7 8 return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值