二叉搜索树(BST)递归与非递归的插入、删除、查找的实现

昨天碰到了二叉搜索树(BST)这种数据结构,索性详细的学习了一遍。

BST的定义:
如果一棵树的左子树不为空,那么其所有节点的值均小于其根结点的值,如果右子树不为空,那么其所有节点的值均大于其根结点的值,它的左右子树也满足如上性质。空树也是BST。

我的BST的实现是以没有重复元素为前提,其实有重复元素也无大碍,只是把实现过程中相关的<改成<=即可,

节点结构定义:

class Node{
public:
    int val;
    Node *left, *right;
    Node() {}
    Node(int val) : val(val), left(NULL), right(NULL) {}
};

BST结构定义及实现方法:

class BST{
private:
    Node *root;
    void Recursion_Insert_Node(Node *&node, int x);//递归插入结点
    void Non_Recursion_Insert_Node(Node **node, int x);//非递归插入结点
    Node *Recursion_Find_Node(Node *node, int x);//递归查找结点
    Node *Non_Recursion_Find_Node(Node *root, int x);//非递归查找结点
    void Delete_Node(Node **root, int x);//删除结点
    void preOrder_Traverse(Node *root);//前序遍历
    void inOrder_Traverse(Node *root);//中序遍历
    void postOrder_Traversal(Node *root);//后序遍历
    void Delete_BST(Node *node);//释放空间
public:
    BST();
    ~BST();
    void Create_BST(int *num, int n);//创建BST
    Node *Find_Node(int x);
    void Delete_Node(int x);
    void preOrder_Traverse();
    void inOrder_Traverse();
    void postOrder_Traversal();
};

让我们首先来看看插入结点是如何实现的:
对于第一个要存入的值,我们将它设置为根结点,然后对于小于根结点的值,我们将其移动到左子树上再进行比较,直到移动到成为叶子节点即可,大于根结点的值同理。

具体实现:

递归:

void BST::Recursion_Insert_Node(Node *&node, int x){
    if(node == NULL){
        node = new Node(x);
    }
    else if(node->val > x){
        Recursion_Insert_Node(node->left, x);
    }
    else if(node->val < x){
        Recursion_Insert_Node(node->right, x);
    }
}

非递归:

void BST::Non_Recursion_Insert_Node(Node **root, int x){
    Node *p = *root;
    Node *fa = *root;
    while(p){
        if(p->val == x){
            printf("%d is already exist!\n", x);
            return;
        }
        fa = p;
        if(p->val > x){
            p = p->left;
        }
        else{
            p = p->right;
        }
    }
    if(fa == NULL){
        *root = new Node(x);
    }
    else 
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值