[数据结构]二叉查找树-基础版

原创 2016年08月30日 18:35:16

基础信息:(摘自某度百科)
二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,O(log(n)).


废话这么多。


逻辑结构

一棵二叉查找树满足一下几条性质。

对于任意节点:
1、其左子节点的键值小于其自身键值
2、其右子节点的键值大于其自身键值
3、任意节点可以代表一棵二叉查找树

如图即是一棵简单的bst(binary search tree):
简单的bst
根据其性质,我们又能总结出:

一棵bst的左节点的左节点的左节点。。。的左节点(最左节点)带有这棵树中的最小键值
同理,最右节点带有最大键值
一棵树中不允许带有两个相同键值的节点同时存在

由于数组过于占用空间,我打算用指针实现。
首先声明一个节点结构体。一个节点包括:

指向左子节点与右子节点的指针
键值
(可选)查询值
struct node{
    node *lchild,rchild;
    int key,value;
    node (int k,int v){key=k,val=v;}
    node(){}
};

现在我们来构建一棵树。
根据性质:任意节点可代表一棵二叉查找树,我们要实例化一个根节点。

class BST{
    node *root;
public:
};

一个数据结构所具有的基本素养(划掉)操作包括插入和查询操作。于是我们在BST类中添加如下insert()与query()。

class BST{
    node *root;
public:
    void insert(int key,int val);
    int query(int key);
};

具体实现

插入
1、递归版
递归查询的优点是代码量短,但对于刚刚接触递归的童鞋较难理解。
接下来的代码我将逐句解释。

void insert(node &*target,int key,int val){
//一定要注意取址符!!!!!
    if(!target){
        target=new node(key,val);
        return;//递归终止条件,如果当前节点为空,则创建一个新的节点
    }
    //只有对非空节点的访问能够执行到这里
    if(key>target->key)
        insert(target->rchild,key,val);
        //由于待插入键值大于当前结点,所以应该向右子节点插入
    else if(key<target->key)
        insert(target->lchild,key,val);
    else return;//插入的键值已经存在于当前的树中,假设这种情况不存在
}

2、非递归版
如果不用递归,代码会变得复杂一些。

void insert(int key,int val){
    node **scout=&root;
    while(*scout){
        if(key>*scout->key)scout=&(*scout->rchild);
        else scout=&(*scout->lchild);
    }
    *scout=new node(key,val);
}

查询
其实查询操作已经隐含在了插入中。

void query(int key,int val){
    node *scout=root;
    while(scout->key!=key){
        if(key>scout->key)scout=scout->rchild;
        else scout=scout->lchild;
    }
    return scout->val;
}

由于不需要修改节点信息,所以查询操作不需要取址符。
至此,一个二叉查找树诞生了。

class Tree{
    struct node{
        int key,val;
        node(int k,int v){key=k,val=v;}
        node(){}
    };
    node *root;
public:
    void insert(int key,int val){
        node **scout=&root;
        while(*scout){
            if(key>*scout->key)scout=&(*scout->rchild);
            else scout=&(*scout->lchild);
        }
        *scout=new node(key,val);
    }
    void query(int key,int val){
        node *scout=root;
        while(scout->key!=key){
            if(key>scout->key)scout=scout->rchild;
            else scout=scout->lchild;
        }
        return scout->val;
    }
};

实例化后就可以使用了
还可以进一步修改成模板类

template<typename KeyType,typename ValType>
class Tree{
    struct node{
        KeyType key;ValType val;
        node(KeyType k,ValType v){key=k,val=v;}
        node(){}
    };
    node *root;
public:
    void insert(KeyType key,ValType val){
        node **scout=&root;
        while(*scout){
            if(key>*scout->key)scout=&(*scout->rchild);
            else scout=&(*scout->lchild);
        }
        *scout=new node(key,val);
    }
    int query(KeyType key){
        node *scout=root;
        while(scout->key!=key){
            if(key>scout->key)scout=scout->rchild;
            else scout=scout->lchild;
        }
        return scout->val;
    }
};
版权声明:本文为博主原创文章,爱转转不转算

基础简单的数据结构-C语言-二叉查找树数组模拟

二叉查找树,它亦或是一颗空树,在或者是有以下性质的二叉树 1:某个结点左子树存在则该左孩子数值必小于该结点数值 2:某个结点右子树存在则该右孩子数值必不小于该结点数值 写代码之前,需要了解两...
  • gaoapp
  • gaoapp
  • 2017年05月02日 19:33
  • 140

数据结构基础(17) --二叉查找树的设计与实现

二叉排序树的特征 二叉排序树或者是一棵空树,或者是具有如下特性的二叉树:     1.每一元素都有一个键值, 而且不允许重复;     2.若它的左子树不空,则左子树上所有结点的值均...

【数据结构与算法基础】二叉查找树 / Binary Search Tree

树, 二叉树, 二叉查找树, 递归, Tree, Binary Tree, Binary Search Tree, Recursion

数据结构基础(17) --二叉查找树的设计与实现

二叉排序树的特征 二叉排序树或者是一棵空树,或者是具有如下特性的二叉树:     1.每一元素都有一个键值, 而且不允许重复;     2.若它的左子树不空,则左子树上所有结点的值均小于根结点的...

[数据结构与算法分析] 二叉查找树的基础概念,插入以及删除

前言二叉查找树(Binary Search Tree,又叫二叉搜索树,二叉排序树)是这样的一种数据结构: 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于...

数据结构与算法(C语言版)__二叉查找树

BST:二叉查找树 Binary Search Tree 二叉查找树的性质: 1.每一元素有一个键值,而且不允许重复 2.左子树的键值都小于根结点的键值 3.右子树的键值都大于根节点的键值 ...

算法系列(八)数据结构之二叉查找树

在算法系列(七)数据结构之树的基本结构和二叉树的遍历 中介绍了基本的树结构,二叉树的实现和遍历。 这篇文章重点学习一下二叉查找树。 概述 二叉排序树(Binary Sort Tree)又称二叉查...

数据结构与算法分析(三) —— 二叉查找树的实现

BST 实现算法

数据结构之 二叉查找树(C语言实现)

数据结构之 二叉查找树1. 二叉查找树的定义二叉查找树(binary search tree)是一棵二叉树,或称为二叉搜索树,可能为空;一棵非空的二叉查找树满足一下特征: 每个元素有一个关键字,并且任...
  • men_wen
  • men_wen
  • 2017年03月28日 20:42
  • 432

数据结构之Java实现二叉查找树

二叉查找树(Binary Search Tree),又被称为二叉搜索树。 它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构]二叉查找树-基础版
举报原因:
原因补充:

(最多只允许输入30个字)