数据结构——二叉排序(查找、搜索)树

2. 二叉排序树

  2.1 二叉排序树(又叫二叉搜索、查找树) 性质:

  1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  3. 左、右子树也分别为二叉排序树。

  数列的顺序不同创建出来的二叉排序树是会不一样的!

    (65 ,32,87, 46,71,98, 39)          

每一层数字的顺序是可以换的,32和87是可以换的。          (32,39,46,65,71,87,89)

  

  如果实际应用中遇到相同的值,那么向左向右插入都可以,只要保证树在中序遍历时是非严格单调递增即可。

  2.2 二叉排序树的建立(非递归+递归算法实现)

注意:结构体里给了left,right默认值NULL。

非递归算法:

typedef struct BinarySortTreeNode{
    int data;
    struct BinarySortTreeNode *Left = NULL;
    struct BinarySortTreeNode *Right = NULL;
}*BinarySortTree;

BinarySortTree CreatBStree(int *a,int length) {
    BinarySortTree BST = new BinarySortTreeNode;
    BST->data = *a++;
    for (int i = 1; i < length; i++) {
        int sign;
        BinarySortTreeNode *pre = BST, *p = BST, *Node=new BinarySortTreeNode;
        while (p) {
            pre = p;
            if (*a <= p->data) {
                p = p->Left;
                sign = 0;
            }
            else {
                p = p->Right;
                sign = 1;
            }
        }
        Node->data = *a;
        sign ? pre->Right = Node : pre->Left = Node;
        a++;
    }
    return BST;
}


  2.3 二叉排序树的插入与删除

(1)插入节点

这个算法加个循环就可以作为 " 建立二叉排序树 " 的算法,上面说的递归算法在这里 - _ - !

BinarySortTree InsertBStree(BinarySortTree BST, int x)
{
    if (BST == NULL){
        BST = new BinarySortTreeNode;
        BST->data = x;
        return BST;
    }
        if (x <= BST->data)
            BST->Left = InsertBStree(BST->Left, x);
        else if (x > BST->data)
            BST->Right = InsertBStree(BST->Right, x);
        return BST;
}

BinarySortTree CreatBStByRecursion(int *a,int length) {
    BinarySortTree BST;
    BST = NULL;
    for (int i = 0; i < length; i++)
        BST = InsertBStree(BST, a[i]);
    return BST;
}

(2)查找节点

  找不到返回NULL,找到返回该节点。

BinarySortTreeNode* BSTreeFind(BinarySortTree BST,int x) {
    if (!BST) {
        //cout << "binart sort tree is null." << endl;return NULL;
    }
    BinarySortTree p = BST;
    while (p) {
        if (x > p->data) p = p->Right;
        else if (x < p->data)p = p->Left;
        else if (x == p->data) return p;
    }
    return NULL;
}

(3)删除节点

  1. 被删除的结点是叶子,将父节点的 left 或 right 指针域设置为NULL。

这是错的!!!这是错的!!!查资料时,看到一位大兄弟这样写,p时要删除的节点,一度误导了我,让我觉得他是对的,但是作为搞基计算机人,要敢于否定!!

 if(  !p->lchild && !p->rchild )
        p = NULL;  

  

  2. 被删除的结点只有左子树或者只有右子树,用该节点的 left 或 right 重新接上来。和删除单链表节点类似。

  

  3. 被删除的结点既有左子树,也有右子树,需要按照二叉排序树的性质从其左子树或者有子树中选择节点补到待删除节点的位置。(选左、选右都可以)

如果从左子树中选,就应该选择左子树中最右边的那个叶子节点(这里肯定是叶子,如果不是叶子,那么就不是最右边的节点)

    如果从右子树中选,就应该选择有子树中最左边的那个叶子节点。

typedef struct BinarySortTreeNode{
    int data;
    struct BinarySortTreeNode *Left = NULL;
    struct BinarySortTreeNode *Right = NULL;
}*BinarySortTree;

void BSTreeDelete(BinarySortTree BST,int x) {
    if (!BSTreeFind(BST, x))return;
    BinarySortTreeNode *p = BST;
    BinarySortTreeNode *pre = p;
    int sign;
    while (p) {
        if (x > p->data) {
            pre = p;
            sign = 0;
            p = p->Right;
        }
        else if (x < p->data){
            pre = p;
            sign = 1;
            p = p->Left;
        }
        else break;
    }

    //1. 左右子树都为空
    if (p->Left == NULL && p->Right == NULL) {
        sign ? pre->Left = NULL : pre->Right = NULL;
        delete p; p = NULL;
        return;
    }
    //2. 左子树或右子树为空
    if (p->Left == NULL) {
        sign ? pre->Left = p->Right:pre->Right = p->Right;
        delete p;
    }
    else if (p->Right == NULL) {
        sign ? pre->Left = p->Left : pre->Right = p->Left;
        delete p;
    }
    //3.左右子树都不为空
    else {
        BinarySortTreeNode *pre = p->Left, *q = p->Left;
        while (q->Right) {
            pre = q;
            q = q->Right;
        }
        p->data = q->data;
        if (q == p->Left)
            p->Left = p->Left->Left;
        else {//最右边的,这个节点只可能有左子树
            pre->Right = q->Left;
        }
        delete q;
    }
}

原文地址:https://www.cnblogs.com/czc1999/p/10284501.html

时间: 2024-10-14 02:28:17

数据结构——二叉排序(查找、搜索)树的相关文章

数据结构——二叉搜索树、B树、B-树

数据结构——二叉搜索树.B树.B-树 1. 综述 二叉排序树(Binary Sort Tree),又叫二叉查找树(Binary Search Tree),也叫二叉排序树. 二叉搜索树满足以下性质: 1. 若根节点左子树不为空,则左子树上的所有节点均小于根节点: 2. 若根节点右子树不为空,则右子树上的所有节点均大于根节点: 3. 其左右子树也是二叉搜索树(递归定义): 4. 没有键值相等的点. B树就是B-树.B树/B-树英文叫B-Tree,可能被不小心翻译成了B-树.

[数据结构与算法]二叉排序(搜索)树实现

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289804.html 定义 二叉排序树又称二叉查找树或二叉搜索树,它或者是一棵空树,或者是具有如下性质的二叉树:1.若它是左子树非空,则左子树上所有节点的值均小于根节点的值2.若它的右子树非空,则右子树上所有节点的值均大于根节点的值3.左.

9-7-平衡二叉排序(搜索)树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 平衡二叉排序(搜索)树 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包    

数据结构-二叉搜索树与双向链表

题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 分析:首先不能创建新的结构,只能在树的前提下进行改变指针的指向.又由于是二叉搜索树,可以通过画图分析可知,二叉搜索树的左子树小于根节点小于右子树,可以发现是个递归过程也是一个中序遍历.所以只需要在中序那块进行指针调整. /* 剑指offer面试题27 */ #include <iostream> using namespace std; struct BinaryTree{

二叉排序

二叉排序,附带插入,查找和删除值.. /* Author: buer Date: 2017/9/18 11:56:02 */ #include <stdio.h> #include <stdlib.h> typedef struct Tree { int data; struct Tree *lchild; struct Tree *rchild; }Tree; void createBiTree(Tree *root); void insertData(Tree *root, i

538-把二叉搜索树转换为累加树

538-把二叉搜索树转换为累加树 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 例如: 输入: 二叉搜索树: 5 / 2 13 输出: 转换为累加树: 18 / 20 13 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree 著作权归领扣网络所有.商业转载请联系官方授权

数据结构之树篇2——二叉排序(查找,搜索)树

二叉排序树 引入 基本性质: 二叉排序树(又叫二叉搜索.查找树) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若右子树不空,则右子树上所有结点的值均大于它的根结点的值: 左.右子树也分别为二叉排序树. 不允许有键值相同结点. 二分查找与二叉排序树 ? 二分查找也称为折半查找,要求原线性表有序,它是一种效率很高的查找方法.如果在需要进行频繁修改的表中采用二分查找,其效率也是非常低下的,因为顺序表的修改操作效率低.如果只考虑频繁的修改,我们可以采用链表.然而,链表的查找效率又非常低.

【数据结构】第9章 查找! (二叉搜索树BST AVL树 B-(+)树 字典树 HASH表)

难产的笔记...本来打算用1天 结果前前后后拖了5天 §9.1 静态查找表 9.1.1 顺序表的查找 各种扫 自己脑补吧 复杂度O(n) 9.1.2 有序表的查找 若表是单调的,则可以利用二分查找.复杂度O(logn) 9.1.3 静态树表的查找 见 http://blog.csdn.net/area_52/article/details/43795837 9.1.4 索引顺序表的查找 建立索引表查找 §9.2 动态查找表 动态查找表的特点是,表结构本身是在查找过程中动态生成的,即对于给定值ke

[数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)

1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它的左子树不为空,则:左子树上所有结点的值< 它根结点的值 若它的右子树不为空,则:右子树上所有结点的值 > 它根结点的值 它的左子树.右子树也分别为二叉排序树(递归性) (按照如上定义,即: 1 无键值相等的结点 2 中序遍历一颗二叉树时,可得一个结点值递增的有序序列) 2 平衡二叉排序树/Bal