1.前言
之前有讲过一种种特殊的树,就是二叉排序树,下面我将详细说明他们的操作。
2.二叉排序树
左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一棵二叉排序树。
推广一下,只要存在顺序性,例如左子树的关键字都大于根结点的关键字,且右子树的关键字小于根结点,这样也可以称为二叉排序树。以下我们以左<根<右为例。
1.性质
1、如果他的左子树不空,则左⼦树上所有结点的值均⼩于它的根结点的值。
2、若它的右子树不空,则右⼦树上所有结点的值均⼤于它的根结点的值。
3、它的左、右树⼜分为⼆叉排序树。
很显然,⼆叉排序树的定义是⼀个递归形式的定义,所以对于⼆叉排序树的操作都是基于递归的⼆叉排序树既然名字中带有排序⼆字,这就是它相对于普通⼆叉树的优势所在了。
2.结点结构
typedef struct BSTnode
{
int data;
struct BSTnode *l;
struct BSTnode *r;
}BSTNode,*BSTree;
3.插入操作
//非递归
BSTree insert(BSTree ro, int x)
{
BSTNode * p = ro;
BSTNode *pre = NULL;
while (p != NULL)