二叉排序树详解及实现

  • 1.什么是二叉排序树
  • 2.二叉排序树的数据结构
    • 2.1二叉排序树的节点类型
    • 2.2二叉排序树中插入某个元素
    • 2.3 二叉排序树中按值查找元素
    • 2.4 找排序二叉树中的最小值
    • 2.5返回排序二叉树中ptr中序遍历的后续节点
    • 2.6 寻找排序二叉树中的最大值
    • 2.7 寻找二叉树中中序遍历ptr节点的前驱
    • 2.8中序遍历排序二叉树(从小到大打印排序二叉树所有元素)
    • 2.9 逆向打印排序二叉树(从大到小打印排序二叉树所有元素)
    • 2.10删除排序二叉树的结点元素为value的结点
  • 3.具体程序及运行结果

1.什么是二叉排序树

二叉排序树(Binary Sorting Tree)又称二叉搜索树(Binary Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。

二叉排序树的定义:
每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同;
二叉排序树或者是空树或者是具有下述性质的二叉数,①其左子树上所有结点的数据值均小于根结点的数据值;②右子树上所有结点的数据值均大于根结点的数据值;③左子树和右子树又各是一棵二叉排序树。
二叉排序树用中序遍历就可以得到由小到大的有序序列

2.二叉排序树的数据结构

2.1二叉排序树的节点类型

typedef struct BstNode//二叉树的节点类型
{KeyType key;   BstNode* parent;//父节点BstNode* leftchild;//左孩子BstNode* rightchild;//右孩子
}BstNode;

2.2二叉排序树中插入某个元素

bool Binary_Sort_Tree::Insert_Value(KeyType value)
{//如果是一棵空树if (root ==nullptr){root = MakeNode(value);//建立一个根节点return true;}//如果不是一棵空树     BstNode* ptr = root;BstNode* parent = NULL;//记录ptr的父节点while (ptr != NULL && ptr->key != value){parent = ptr;ptr = value > ptr->key ? ptr->rightchild : ptr->leftchild;}
//case1:插入相同元素if (ptr != NULL && ptr->key == value) return false;//不能插入相同元素
//case2:空位置ptr = MakeNode(value);ptr->parent = parent;if (ptr->key > parent->key) { parent->rightchild = ptr; }else { parent->leftchild = ptr; }cursize++;return true;
}

2.3 二叉排序树中按值查找元素

如果要查找的元素值>根节点值,就在根节点右边查找,否则在根节点左边查找。
BstNode* Binary_Sort_Tree::FindValue(KeyType value)
{BstNode* ptr = root;while (ptr != nullptr && ptr->key != value){ptr = value > ptr->key ? ptr->rightchild : ptr->leftchild;}return ptr;
}

2.4 找排序二叉树中的最小值

根据排序二叉树的性质,可以很轻松的得到最小值即为最左边节点的值。
BstNode* Binary_Sort_Tree::FirstNodeByMiddleOrder()
{BstNode* ptr = root;while (ptr && ptr->leftchild){ptr = ptr->leftchild;}return ptr;
}

2.5返回排序二叉树中ptr中序遍历的后续节点

节点ptr的后续节点为排序二叉树中第一个比ptr->key大的元素,即可以分为如下两种情况:
①如果ptr存在右子树,则ptr的后续节点为ptr右子树的最左端的节点。
②如果ptr不存在右子树,则ptr的后续节点可以回溯到根节点
具体如下:
BstNode* Binary_Sort_Tree::NextNodeByMiddleOrder(BstNode* ptr)
{           if (ptr == NULL) return ptr;if (ptr->rightchild != NULL){return FirstNodeByMiddleOrder(ptr->rightchild);//右子树的最左端}else{BstNode* parent = ptr->parent;while (parent != NULL && parent->leftchild != ptr)//pa->rightleft == ptr;{ptr = parent;parent = ptr->parent;}return parent;}
}

2.6 寻找排序二叉树中的最大值

根据排序二叉树的性质,可以很轻松的得到最小值即为最右边节点的值。
BstNode* Binary_Sort_Tree::LastNodeByMiddleOrder()
{BstNode* ptr = root;while (ptr && ptr->rightchild){ptr = ptr->rightchild;}return ptr;
}

2.7 寻找二叉树中中序遍历ptr节点的前驱

节点ptr的前驱为排序二叉树中第一个比ptr->key小的元素,即可以分为如下两种情况:
①如果ptr存在左子树,则ptr的后续节点为ptr左子树。
②如果ptr不存在左子树,则ptr的后续节点可以回溯到根节点
具体如下:
BstNode* Binary_Sort_Tree::PrecursorofPtr(BstNode* ptr)
{if (ptr == NULL) return ptr;if (ptr->leftchild != NULL){return LastNodeByMiddleOrder(ptr->leftchild);//左子树的最右端}else{BstNode* parent = ptr->parent;while (parent != NULL && parent->rightchild != ptr)//pa->rightleft == ptr;{ptr = parent;parent = ptr->parent;}return parent;}
}

2.8中序遍历排序二叉树(从小到大打印排序二叉树所有元素)

void Binary_Sort_Tree::MiddleOrder()
{cout << "排序二叉树的非递归中序遍历:" << endl;BstNode* ptr = FirstNodeByMiddleOrder();for (; ptr != nullptr; ptr = NextNodeByMiddleOrder(ptr)){cout << ptr->key << "  ";}cout << endl;
}

2.9 逆向打印排序二叉树(从大到小打印排序二叉树所有元素)

void Binary_Sort_Tree::ReverseInorder()
{BstNode* ptr = root;cout << "二叉排序树的逆向打印:" << endl;for (BstNode* p = LastNodeByMiddleOrder(ptr); p != NULL; p = PrecursorofPtr(p)){cout << p->key << "  ";}cout << endl;
}

2.10删除排序二叉树的结点元素为value的结点

删除某个元素可分为以下三种情况:
①如果是叶子节点直接删除即可。
②如果不是叶子节点具体讨论如下:
bool Binary_Sort_Tree::RemoveNode(KeyType value)
{BstNode* ptr = root;//空树的删除if (ptr == NULL) return false;BstNode* pa = NULL;BstNode* p = ptr;while (p && p->key != value){//pa = p;p = value < p->key ? p->leftchild : p->rightchild;}//没有找到这个结点if (p == NULL) return false;//双分支if (p->leftchild && p->rightchild){BstNode* q = FirstNodeByMiddleOrder(p->rightchild);p->key = q->key;p = q;}//单分支pa = p->parent;BstNode* child = p->leftchild != NULL ? p->leftchild : p->rightchild;if (child){child->parent = pa;}if (pa == NULL){ptr = child;}else{if (pa->leftchild == p){pa->leftchild = child;}else{pa->rightchild = child;}}cursize--;//直接是叶子delete p;return true;
}

3.具体程序及运行结果

程序如下:
二叉排序树的代码下载

二叉排序树详解及实现相关推荐

  1. 数据结构与算法——二叉排序树详解以及代码实现

    二叉排序树介绍 我们知道二叉树,每个结点最多有2棵子树,被称为左子树 和 右子树. 二叉排序树,显然也是一颗二叉树,它有更突出的特性在数据域上呈现排序的特性. 在二叉排序树中,每个树的左子树的数据域均 ...

  2. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)

    目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...

  3. 详解二叉排序树及其基本操作

    详解二叉排序树及其基本操作 二叉排序树又称二叉查找树,它是一种对排序和查找都很有用的特殊二叉树. 1. 二叉排序树的定义 二叉排序树或者是一颗空树,或者是具有下列性质的二叉树: (1) 若它的左子树不 ...

  4. Java 集合类详解

    0.参考文献 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比 ...

  5. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  6. 剑指offer(1-10题)详解

    文章目录 01二维数组的查找 02替换空格 03从尾到头打印链表 04重建二叉树★ 05 用两个栈实现队列 06旋转数组的最小数字 07 斐波那契数列 08 跳台阶 09 变态跳台阶★ 10 矩阵覆盖 ...

  7. AVL树平衡旋转详解

    AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...

  8. [学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

    文章目录 引入概念 全套模板 变量声明 update ==rotate旋转== splay操作 insert插入 delete删除 查找x的位置 查找第k大 前驱/后继 极小值-inf和极大值inf的 ...

  9. 红黑树操作详解——很形象的过程

    红黑树是一种很好的自平衡二叉排序树,在此,给出一个网友给出的红黑树操作详解: https://segmentfault.com/a/1190000012728513 里面给出了红黑树的详细操作,过程很 ...

最新文章

  1. python 二维 排序
  2. 外观模式(Facade) - 为系统分层次
  3. Python cv2 摄像头
  4. (1)kendo UI使用基础介绍与问题整理——简单说明
  5. angular directive自定义指令
  6. cent os重置mysql,linux mysql 能登陆不能修改用户(cent os 6.2)解决思路
  7. python调用matlab环境配置、非常详细!!!_[python][matlab]使用python调用matlab程序
  8. 一个牛逼的coder是这样诞生的。
  9. “遗留代码是传奇!”
  10. HSImageSidebarView
  11. Hyperledger fabric v2.3 交易流程 翻译
  12. Dev ChartControl
  13. 汉王考勤管理系统使用教程
  14. Windows11企业版22000.1精简版(附下载链接)
  15. 深海迷航坐标传送代码_深海迷航 代码整合
  16. Android实现多国语言适配:app名称随系统的语言而更换
  17. 【jzoj1592】【二分】【GDKOI训练】音乐节拍
  18. 腾达路由器怎么设置网站服务服务器,腾达(Tenda)-无线路由器如何设置上网?
  19. (简单)华为P20 EML-AL00的USB调试模式在哪里打开的步骤
  20. Overload(重载)

热门文章

  1. VS2008 使用小技巧-------快捷键
  2. 商品房买卖抵押贷款中的保险
  3. GIONEE A1 金立A1 root 刷机包 GIONEE SWW1609_0201 mt6755
  4. juniper防火墙常用配置
  5. linux fscanf,linux fscanf
  6. mapX - 基本操作(1)
  7. 任务调度 的常用的基本方式
  8. Word文档 替换功能
  9. 【总结】IDS入侵检测系统
  10. 最小二乘法求模型最优解