数据结构二叉检索树的复习

数据结构二叉检索树的复习

(一)概念

  • 完全二叉树,使用数组实现
    这里的 r 表示结点的下标(index)
    这个二叉树的范围在 0 到 n - 1 可以自己推出1到n的亲属节点
    在这里插入图片描述

  • 对于Binary Search Tree, 其结点为K, 那么他的左子树中所有节点都小于K,右子树中所有节点都大于或等于K
    若按照inorder的方式打印出来,会得到由小到大的结点。

  • 时间复杂度
    (1)数学基础
    log(a) (MN)=log(a) M+log(a) N
    log(a) (M÷N)=log(a) M-log(a) N
    log(a) M^n=nlog(a) M
    log(a)b
    log(b)a=1
    log(a) b=log(c)b÷log(c)a

在这里插入图片描述
在有序数组中使用二分法 查找为Logn

(二)应用题、编程
首先是树结点结构体

template <typename E>
struct BSTNode{
E data;
BSTNode *left;
BSTNode *right;
}
  • 1.按顺序创建、插入BST、二叉检索树的插入某个值
template <typename Etypename key>
BSTNode* insert(BSTNode<E> *root,key k){
if(root==NULL){
BSTNode *q= new BSTNode;//用new分配二叉树节点空间,后续删除也要使用delete
//new会返回指针,要用指针分配值
p->data=k;
p->left=NULL;
p->right=NULL;
}
else{
if(k>=root->data){
root->right = insert(root->right,k);
}
else{
root->left=insert(root->left,k);
}
}
return root; //返回插入结点的指针
}
    1. 查找二叉树中某一个值
template <typename Etypename key>
void find(BSTNode<E> *root,key k){
if(root==NULL){return false;}
if(root->data==k){return true;}

if(root->data >= k){
return find(root->right,k);} //记得参数K不要忘记写了
else{
return find(root->left,k);
}
}


}
  • 3.删除BST中的某个值
    (1)删除叶节点:直接删除即可
    (2)删除的结点只有左子树或右子树,用子树取代
    (3)删除的结点既有右子树又有 左子树,在右子树中找到最小的结点,让他取代。
template <typename E,typename Key>
*BSTNode DeleteNode(BSTNode<E> *root, Key k){
if(root==NULL){return NULL;}
if(k>=root->data){
root->right = delete(root->right);
}
else if(k<root->data){
root->left =delete(root->left);
}
else{  //找到删除的节点了

if(root->left && root->right){//如果有两棵子树
//找到右节点的最小值
BST *tmp=root->right;
while(tmp->left){
tmp=tmp->left;
}
//进行替换:
int t=root->data;
root->data=tmp->data;
tmp->data = t;
root->right = delete(root->right,t); //删掉这个“叶节点的值”
}
else if(root->left==NULL && root->right==NULL){
root=NULL; //删除叶节点
}
else{//存在一棵树
if(root->left){         //存在左树
root=root->left;
}
else {
root=root->right;

}
return root; //返回删除结点的替代结点NULL
}


}

这里复习一下 if-else-if

if(){}
else{}
//若if不成立,执行else

if (表达式1{语句1}
else if (表达式1{语句2;}
else if (表达式2{语句3;}
else if (表达式3{语句4;}
else { 语句n;}
//当表达式1、2、3、4全都不成立时,才执行语句n
如果在前面语句if成立或else if成立,直接跳出if条件语句

if (){}
if (){}
else {}
//这样的使用表现为 后面的if和else 组合起来
  1. 判断是否为二叉树
//判断是否为二叉树

template <typename E>

bool judgeBST(BitNode<E>* root) {

	BitNode<E>* pre = new BitNode<E>();

	if (root == NULL) { return true; }

	else {

		if (!judgeBST(root->lc)) {

			return false;

		}

		if (pre && pre->data > root->data) { return false; }

		pre = root;

		return judgeBST(root->rc);

	}

	

}
  1. 求打印某个范围内的值
template <typename E,typename key>

void printRange(BitNode<E>* root, key low, key high) {

if (root == NULL) { return; }

if(high>root->data){printRange(root->left,low,high);}
else if(low>toor->data){printRange(root->right,low,high);}
else{
printRange(root->left,low,high);
cout<<root->data;
printRange(root->right,low,high);
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值