二叉查找树(1) - 查找以及插入

WikiPedia中,对二叉查找树的定义如下:

二叉查找树,是一种基于节点的二叉树,有下面的性质:

  • 节点的左子树中任意节点值小于根节点
  • 节点的右子树中任意节点值大于根节点
  • 左右子树都必须是二叉查找树,不允许存在重复节点。

二叉查找树的上述性质,保证了各节点值的顺序,这样进行查找,求最大值最小值时,会效率更高。如果没有这种顺序,则可能需要将树中的每个节点与指定的查找值进行比较。

查找一个节点值

二叉树中查找一个节点值时,首先与根节点比较,相等则返回根节点。如果根节点小于指定值,则递归的查找右子树。否则查找左子树。

//在二叉搜索树中查找特定的值
Node* search(Node* root, int key)
{
    // Base Cases: 空树或者值为根节点值
    if (root == NULL || root->key == key)
       return root;

    // 指定值大于根值
    if (root->key < key)
       return search(root->right, key);

    // 指定值小于根植
    return search(root->left, key);
}

插入一个节点值

新的值常常做为叶子节点插入到树中。首先从根节点开始,直到遇到叶子节点为止。一旦找到了叶子节点,则将新的值做为叶子节点的一个孩子。

        100                                                    100
        /   \                   Insert 40                    /           20     500    --------------------->       20     500
     /   \                                                     /    \
  10   30                                             10     30
                                                                        \
                                                                       40
#include <iostream>

struct Node
{
    int key;
    Node *left;
    Node *right;
};

// 创建一个新的BST节点
Node *createNewNode(int item)
{
    Node *temp =  new Node;
    temp->key = item;
    temp->left = temp->right = NULL;
    return temp;
}

// 中序遍历二叉搜索树
void inorder(Node *root)
{
    if (root != NULL)
    {
        inorder(root->left);
        std::cout<<" "<<root->key<<" ";
        inorder(root->right);
    }
}

//插入新节点至二叉搜索树中
Node* insert(Node* node, int key)
{
    //空树
    if (node == NULL)
        return createNewNode(key);

    //递归插入。如果已存在指定值,则不插入
    if (key < node->key)
        node->left  = insert(node->left, key);
    else if (key > node->key)
        node->right = insert(node->right, key);

    //返回未修改的node指针
    return node;
}

int main()
{
    /* 构建一颗如下所示的BST
              50
           /               30      70
         /  \    /         20   40  60   80
    */
    Node *root = NULL;
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);

    // 中序遍历
    inorder(root);

    return 0;
}

输出:

20 30 40 50 60 70 80
时间复杂度: 最差的查找以及插入操作的时间复杂度为O(h),其中h是树的高度。在最差情况下,可能需要从根节点一直遍历到叶子节点。
时间: 2024-08-04 18:18:27

二叉查找树(1) - 查找以及插入的相关文章

二叉查找树的查找、插入和删除 - Java实现

http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 作者: yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/ 英文原文的出处:http://algs4.cs.princeton.edu/32bst/ 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍

重温数据结构:二叉排序树的查找、插入、删除

读完本文你将了解到: 什么是二叉排序树 Binary Sort Tree BST 二叉排序树的关键操作 查找 插入 删除 运行代码测试 一道面试题 总结 Thanks 我们知道,二分查找可以缩短查找的时间,但是有个要求就是 查找的数据必须是有序的.每次查找.操作时都要维护一个有序的数据集,于是有了二叉排序树这个概念. 上篇文章 我们介绍了 二叉树 的概念,二叉树有左右子树之分,想必在区分左右子树时有一定的规则. 现在我们来介绍二叉树的一种特殊形式 - 二叉排序树,了解它的区分策略及常用操作. 什

二叉排序树的查找、插入和删除

1.      二叉排序树 二叉排序树(Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有结点值相同的结点. 二叉排序树又称二叉查找树(Binary Search Tree),亦称二叉搜索树.通常采用二叉链表作为二叉排序树的存储结构.中序遍历二叉排序树可以得到关键字有序的序列,即一个无序序

闭散列表的查找、插入和删除操作的完整C代码

/*闭散列表的建立.查找.插入.删除*/ #include <stdio.h> #define NIL -1 //假设关键字为非负整数 #define DEL -2 typedef int KeyType; KeyType HashTable[13]; //便于验证算法,关键字个数假定为不超过13,哈希表长定为13 //关键字插入函数 void InsertHashTable(KeyType k) { for(int i=0; i<13; i++) if( NIL == HashTabl

在二叉查找树中查找不小于某个值的最小数值

给定一颗二叉查找树,给定一个值value,求该二叉查找树中不小于某个值value的最小数值. 思考:二叉查找树的特征就是左子节点比父节点值小,右子节点比父节点值大.在获得该二叉查找树根节点的情况下,想要得到该二叉查找树中不小于某个值得最小数值,分以下几点考虑: 1.如果currentNode.getData() == value , 则currentNode节点即为所求节点. 2.如果currentNode.getData() < value , 则当前节点的左子树所有节点的值均小于value,

二叉排序树(BST):创建、查找、插入与删除

删除结点的相关操作(左右子树均为非空的删除结点的方法): 算法分析: 下面以实例来说明二叉排序树的创建.查找.插入和删除等相关操作: 如输入关键字序列(45,24,37,12,54,93),然后对其进行相应的操作,程序如下: #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct BiTNode { int value; struct B

顺序表的查找、插入、删除、合并操作及其优缺点

顺序表的查找.插入.删除.合并操作,用c++实现相关代码: #include<iostream> using namespace std; //定义线性表顺序存储结构 #define MAXSIZE 100  //线性表最大长度 typedef struct { //线性表占用数组空间 int elem[MAXSIZE]; //记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1 int last; }SeqList; //顺序表的按内容查找运算 //在顺序表L中查找与e

B树的查找、插入操作

B树的性质: 根节点至少有两个孩子 每个非根节点有[,M]个孩子 每个非根节点有[-1,M-1]个关键字,并且以升序排列 key[i]和key[i+1]之间的孩子节点的值介于key[i].key[i+1]之间 所有的叶子节点都在同一层 以下代码实现了B树的查找和插入操作,删除操作暂未实现 插入:先找到插入结点的位置,插入后判断关键字的个数是否小于M(M为阶数),小于返回,不小于进行分裂. 删除:任一关键字K的中序前趋(后继)必是K的左子树(右子树)中最右(左)下的结点中最后(最前)一个关键字.

二叉排序树(概念,查找,插入,删除)

查找基本概念 查找表:由同一类型的数据元素构成的集合.对查找表的常用操作:查询元素是否存在.查询元素属性.插入一个数据元素.删除一个数据元素. 查找:也叫检索,是根据给定的某个值,在表中确定一个关键字等于给定值的数据元素. 关键字:可以标识一个数据元素的某个数据项. 主关键字:可以唯一地识别一个数据元素的关键字. 静态查找表:只进行查询某元素在表中与否或检索某元素的各种属性操作的表. 动态查找表:查找时同时进行插入表中无的元素或删除表中有的某元素的表. 二叉排序树 定义:二叉排序树(Binary