二叉搜索树(BST)插入与查找

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)

二叉查找树的性质:
1.任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2.任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.任意节点的左、右子树也分别为二叉查找树;
4.没有键值相等的节点。

二叉查找树的优点:
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。

二叉查找树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉查找树的存储结构。中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉查找树变成一个有序序列,构造树的过程即为对无序序列进行查找的过程。每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索、插入、删除的复杂度等于树高,期望 O(log n),最坏 O(n)(数列有序,树退化成线性表)。
虽然二叉查找树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为 O(log n),如SBT,AVL树,红黑树等。故不失为一种好的动态查找方法。

以下为二叉搜索树的插入和查找.

#include<iostream>
using namespace std;
/******二叉树节点 ****/ 
typedef struct node{ 
    int data;
    struct node *lchild;
    struct node *rchild; 
}Node;
/*******二叉树 *****/
typedef struct{
    node *root;
}Tree;
/******二叉树的创建与初始化 ****/ 
Tree* new_tree(){
    Tree *tree= new Tree;
    tree->root=NULL;
    return tree;    
}
/********二叉树节点的创建与初始化 *****/
Node* new_node(int v){
    Node *node = new Node;
    node->data = v;
    node->lchild = NULL;
    node->rchild = NULL;
    return node;
}
/*****插入******/ 
void insert(Tree* tree,int v){
    if(tree->root == NULL)
        tree->root = new_node(v);
    else{
        Node* p= tree->root;
        Node* pre=p;
        while(p != NULL){
            pre=p;
            if(v < p->data)
                p=p->lchild;
            else if( v > p->data)
                p=p->rchild;
            else
                return;
        }
        if(v < pre->data)
            pre->lchild = new_node(v);
        else
            pre->rchild = new_node(v);
    }
}
/*******查找****/ 
Node* search(Tree *tree,int v){
    Node* p = tree->root;
    while(p != NULL){
        if(v < p->data)
            p=p->lchild;
        else if(v > p->data)
            p=p->rchild;
        else
            return p;
    } 
    return NULL;
}
/***先序遍历*****/ 
void preOrder(Node *node){  
    if(node != NULL){
        cout<<node->data<<" ";
        preOrder(node->lchild);
        preOrder(node->rchild);
    }
}
int main(){
    Tree *tree= new_tree();
    int a[6]={5,9,7,2,1,8};
    for(int i=0;i<6;i++)
        insert(tree,a[i]);//bst插入 

    /****bst查找 ****/
    Node *p=search(tree,2);
    if(p!=NULL)
        cout<<"yes"<<endl;
    else
        cout<<"no"<<endl;

    /****bst遍历*****/ 
    cout<<"preOrder:"<<endl;
    preOrder(tree->root);

    return 0;
}
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/sub_569/article/details/54565374
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞