二叉树的应用——二叉排序树、选择树、判定树

本文介绍了二叉树在排序和查找中的应用,重点讲解了选择树在外部排序中的作用,以及二叉排序树(二叉查找树)的查找、插入和删除操作。此外,还探讨了判定树的概念,它利用树结构解决判断问题,如通过三次比较找出一枚假币。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选择树

这就要提到外部排序了。因为内存的空间不足,有时候不能将排序的全部内容都放在内存中完成,就像是新学期老师按身高排座位,教室内站不开就要到外面排队。
但计算机还有一些附加条件,比如外面空间有限,所以排身高只能在室内进行,所以呢,人们就将外存中的数据分为几组,在内存中排好了然后合并。

这个时候,选择树就登场了。图中一共是八组已经排好了的,每一组取最小的元素,然后按照满二叉树的结构排出最小的,(这里是第四组的6最小)所以第四组的15跟进,和剩下的7个数字接着比较。
在这里插入图片描述

二叉排序树

如果不是空树,那么左子树的值小于根节点小于右子树,并且每一个子树都是二叉排序树
又叫二叉查找树,因为查找的效率要比线性查找更高。
在这里插入图片描述
由于其性质,所以只需要将树中序遍历,就能得到一个排好序的数列。

Struct  BST
{
	int data ;
	struct BST *lchild, *rchild ;
}

查找:思路很清晰,看一下就行

BST* search(int k, BST* F)
{   
	p = F;
    if ( p == Null )  
    	return Null ;
    else if ( k == p->data )
    	return p ;
    else if ( K < p->data )
    	return search( k,  p->lchild ) ;
     else if ( K > =p->data )
     	return search( k,  p->rchild ) ;
}

插入:

Void  Insert(int R , BST *F)
{  
	if (F == Null)
    {  
    	F = new BST;
        F->data = R ;
        F->lchild = Null ;
        F->rchild = Null ;   
    }
    else if( R.key < F->data )
    	Insert ( R , F->lchild )
    else if( R.key >= F->data )
        Insert ( R , F->rchild )
}

要知道,插入后的结点都是在叶子节点上,因为不停的比较直到到了某一个叶子节点才能确定是这个结点的哪边孩子。

删除:

void deleted(int data, BST* F)
{
	if(F)
	{
		if(data < F->data)
			deleted(data, F->lchild)
		else if(k > F->data)
			deleted(data, F->rchild)
		else
		{
			if(F->rchild == NULL)
				F = F->lchild;
			else if(F->lchild == NULL)
				F = F->rchild;
			else 
				F->data = DeleteMin(F->rchild);
		}
	}
}

在这里插入图片描述
如果度数不为2,直接把一个孩子提上来就行了,叶子就直接为空;
但如果是2度结点,那么就需要找一个合适的结点代替了,下面就是DeleteMin函数求右孩子最左结点
(其实左孩子最右结点也行的)

int DeleteMin(BST* F)
{
	int ret;
	BST* p = F;
	if(!F->lchild)
	{
		ret = F->data;
		F = F->rchild;
		free(p);
		return ret;
	}
	else 
		return DeleteMin(F->lchild);
}

判定树

和选择树差不多,就是用到了树的结构:
八枚硬币,有一个是假的,比较三次确定哪个是假币以及假币和真币相比质量如何?
在这里插入图片描述
特点:

  • 判定树整体是该问题的所有可能解;
  • 每一个从根到叶子都是一种可能解
  • 每一个非叶子节点对应的子树都是不同的可能性
    最后贴一张图,互相伤害,反正我是没做出来几个,要是大佬们有思路了留言哈
    在这里插入图片描述
### 如何区分二叉排序树与平衡二叉树 #### 关键特性 二叉排序树(Binary Search Tree, BST)是一种特殊的二叉树,其定义为:对于任意节点,左子上所有节点的值均小于该节点的值,而右子上所有节点的值均大于该节点的值[^2]。这种结构使得二叉排序树非常适合用于动态集合操作,如查找、插入和删除。 然而,当数据分布不均匀或按顺序插入时,二叉排序树可能会退化成斜二叉树或链表形式,从而导致时间复杂度恶化到 O(n)[^1]。因此,为了保持高效的查询性能,引入了平衡二叉树的概念。 平衡二叉树(Balanced Binary Tree),也称为 AVL ,是在二叉排序树基础上发展而来的一种自平衡二叉搜索。它的核心特点是通过维护每个节点的高度差(Balance Factor, BF),即左右子高度之差不超过 1 来实现整体平衡[^3]。一旦因插入或删除操作破坏此条件,则需执行特定旋转算法恢复平衡状态。 另外值得注意的是,在实际应用中还存在其他类型的近似平衡种比如红黑。虽然它们不像严格意义上的AVL那样追求极致均衡但依然能够提供较好的平均表现同时减少频繁调整带来的开销[^4]。 #### 判断方法 要辨别给定的一棵二叉树究竟是普通的BST还是更进一步满足约束条件成为AVL型态可以遵循如下准则: - **验证基本属性**:先确认目标对象确实属于标准意义下的二叉搜寻范畴之内——也就是遍历过程中始终维持左侧数值较小右侧较大这一规律; - **检测高度差异限制**:接着针对每一个内部节点计算其所关联两支延伸部分各自所达到的最大层数差距是否恒处于[-1,+1]区间范围内;若是如此则可判定当前实例构成了一株合格的平衡版本;反之只要发现任一点超出上述界限即可断言并非真正意义上实现了自我调节机制后的最终形态。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def is_balanced(root: TreeNode) -> bool: def check(node): if not node: return 0 left_height = check(node.left) if left_height == -1: return -1 right_height = check(node.right) if right_height == -1 or abs(left_height - right_height) > 1: return -1 return max(left_height, right_height) + 1 return check(root) != -1 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值