目录
二叉排序树(二叉搜索树)定义:
二叉排序树的性质:
二叉排序树的操作:
c语言实现二叉排序树:
C++实现二叉排序树:
二叉排序树(二叉搜索树)定义:
二叉排序树的性质:
(1)二叉排序树的中序遍历序列是递增的
推论:只给出二叉排序树的后序/前序序列,可以唯一确定二叉排序树
(2)根最左下节点值最小,根最右下节点值最大
二叉排序树的操作:
1在二叉排序树中查找一个元素k:
过程类似于二分查找:如果mid=k,返回mid;如果mid>k,向左区间中查找;如果mid<k,向右区间中查找
时间复杂度:O(log2n)
①递归出口:如果根节点为空,或者根节点值等于待查找的元素,返回根节点
②如果根节点的值<k,向左子树中查找
③如果根节点的值>k,向右子树中查找
伪代码:
search(root,k):if root==null or k==root的值 return root if root的值>k 递归调用函数search(root->left,k) if root的值<k 递归调用函数search(root->right,k)
2 在二叉排序树中插入一个值为k元素
在二叉排序树中插入一个关键字为k的节点要保证插入后仍满足二叉排序树有序的性质
时间复杂度:O(log2n)
伪代码:
insert(root,k):if root==NULL 新建一个值为k的node return node if k==root的值 无需插入 if k<root的值 //k插入到左子树 insert(root->left,k) else //k插入到右子树 insert(root->right,k)
3 由一个数组创建一个二叉排序树
创建二叉排序树的根节点,扫描数组,并逐个插入到二叉排序树中
create(root,int a[]){ 为root申请内存空间 for(i:a) insert(root,a[i]) }
4在二叉排序树中删除一个元素k
递归实现:
递归调用:①如果k<根节点的值,向左子树中删除k
递归调用:②如果k>根节点的值,向右子树删除k
递归出口:③如果k=根节点的值,分三种情况讨论
Ⅰ根节点既有左子树又有右子树,用根节点的中序后继节点替代根节点
在二叉排序树中, 根节点的中序后继节点为根节点右子树的最左下节点(因为该节点的值是右子树中大于根节点的最小的值)
Ⅱ根节点左子树为空,用右子树替代根节点,即返回右子树
Ⅲ根节点右子树为空,用左子树替代根节点,即返回左子树
Ⅳ根节点左右子树均为空即根节点是叶子节点,返回空
例:
5.判定一棵树是否是二叉排序树
利用二叉排序中序遍历递增的性质:中序遍历该树,判断该中序序列是否是递增序列
c语言实现:
声明二叉排序树结点类型
二叉排序树的插入:
二叉排序树的建立:
二叉排序树的查找:
二叉排序树的删除:
C++实现二叉排序树:
声明节点类型
二叉排序树的插入:
二叉排序树的查找:
二叉排序树的删除:
判定二叉搜索树: