定义

一棵二叉搜索树是以一棵二叉树来组织的,如下图。这样一棵树可以使用一个链表数据结构来表示,其中每个节点就是一个对象。除了key和卫星数据之外,每个节点还包含属性left、rightp,他们分别指向节点的左孩子、右孩子和双亲(父节点)。如果某个孩子节点和父节点不存在,则相应属性的值为NIL。根节点是树中唯一父指针为NIL的节点。[来源:算法导论 第三版]

性质

二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储:

设x是二叉搜索树中的一个节点。

如果y是x左子树中的一个节点,那么y.key  <= x.key。

如果y是x右子树中的一个节点,那么y.key >= x.key。

二叉搜索树性质允许我们通过一个简单的递归算法来实现按序输出二叉搜索树中的所有关键字,这种算法称为中序遍历(inorder tree walk)算法。这样命名的原因是输出的子树根的关键字位于其左子树的关键字值和右子树的关键字值之间。(类似地,先序遍历(前序遍历,preorder tree walk)中输出的根的关键字在其左右子树的关键字之前,而后序遍历(postorder tree walk)输出的根的关键字在其左右子树的关键字值之后)调用下面的过程INORDER-TREE-WALK(T.root)[伪代码段],就可以输出一棵二叉搜索树T中的所有元素。

INORDER-TREE-WALK(x)
if x != NILINORDER-TREE-WALK(x.left)print x.keyINORDER-TREE-WALK(x.right)

前序遍历:根结点 -> 左子树 -> 右子树

中序遍历:左子树 -> 根结点 -> 右子树

后序遍历:左子树 -> 右子树 -> 根结点

/*
代码来源:
https://github.com/xiexiexx/BIDS/blob/master/set/binary_tree.cpp
*/
template <typename T>
struct tnode {T data;tnode<T>* left;tnode<T>* right;tnode<T>* parent;
};template <typename iterator>
void pre_order(iterator p)      //前序遍历
{if (p != NULL){cout << p->data << ' ';pre_order(p->left);pre_order(p->right);}
}template <typename iterator>
void in_order(iterator p)       //中序遍历 中序遍历的顺序在横轴上的投影
{if(p != NULL){in_order(p->left);cout << p->data << ' ';in_order(p->right);}
}template <typename iterator>
void post_order(iterator p)     //后序遍历
{if(p != NULL){post_order(p->left);post_order(p->right);cout << p->data << ' ';}
}

[未完...]

[学习][数据结构]二叉搜索树相关推荐

  1. 数据结构---二叉搜索树

    数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...

  2. 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...

    1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...

  3. 数据结构 二叉搜索树BST的实现与应用

    概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...

  4. 数据结构——二叉搜索树

    一.定义 二叉搜索树(binary search tree),又叫二叉查找树.二叉排序树.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于 ...

  5. 深入学习理解二叉搜索树(附详细讲解与实例分析)

    原博客       https://blog.csdn.net/qq_21396469/article/details/78419609 写在前面 本文主要分为三个部分.        第一部分介绍了 ...

  6. 数据结构——二叉搜索树的C语言实现

    1.什么是二叉搜索树? 2.二叉搜索树的操作 3.二叉搜索树的C语言实现 #include<stdio.h> #include<stdlib.h>#define Element ...

  7. 数据结构 二叉搜索树的删除

    文章目录 概述 待删除的结点没有子树 待删除的结点仅有一颗子树 待删除的结点有两颗子树 C代码实现 概述 这是一篇短文,专门考究一下二叉搜索树的删除. 二叉搜索树的建立非常简单,如果不熟悉的见此文 树 ...

  8. 23王道数据结构二叉搜索树(BST)算法题(6-11题)总结(伪代码)

    6.判断给定的二叉树是否是二叉排序树 算法思想:中序遍历,一棵树为二叉排序树即左右子树为二叉排序树,且当前根节点和左右子树呈递增序列,对左右子树也是如此判断,显然是个递归过程              ...

  9. 《恋上数据结构第1季》平衡二叉搜索树、AVL树

    AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...

最新文章

  1. 大型Web应用的数据库设计与部署
  2. canvas arcTo()用法详解 – CodePlayer
  3. JavaScript学习总结二:js闭包(Closure)概念
  4. mysql自定义序号_MySQL数据库之在mysql中给查询的结果添加序号列
  5. HDU 2159 FATE 动态规划二维费用的背包问题
  6. java邮件系统(java邮件收发系统源代码和下载地址)
  7. 【BZOJ1042】硬币购物(动态规划,容斥原理)
  8. ajax请求模拟登录
  9. ++ 多核cpu 并行_一文读懂什么是多核并行计算(三)
  10. 1.7 编程基础之字符串 31 字符串p型编码 python
  11. java是纯_让你真正了解Java(纯干货)
  12. 【稀疏向量技术是什么?】差分隐私系统学习记录(六)
  13. 相对定位与绝对定位联合使用
  14. MySQL8.0.25命令行安装与配置
  15. discuz!net 的使用
  16. mysql 因单个表过大导致导入数据库失败
  17. linux cmake 快速安装
  18. 美河LINUX 内核学习视频
  19. 玩转3D全息图像!AI即刻生成
  20. 训练:Training Volume Landmarks for Muscle Growth - Renaissance Periodization论文阅读

热门文章

  1. windows10无线网络未连接打红叉怎么办
  2. MATLAB绘制雷达图并导出矢量图到Visio编辑(论文用图)
  3. java利用qrcode生成带有logo的二维码(logo位置及大小自己调)
  4. 计算机软件著作权评估
  5. 荣耀变局之下,国产智能手机九年往事
  6. 红蓝对抗场景下的二三事
  7. 用于Excel 2017的CData ODBC驱动程序 Linux DSN配置
  8. 【线段树】【P5522】[yLOI2019] 棠梨煎雪
  9. 二级菜单(隐藏显示)
  10. 小米路由器4刷padavan固件