Balanced Binary Search Trees,CFGLR5E,推性质找规律

本文深入讨论了满足特定条件的二叉树构造方法,包括左子树为偶数大小,右子树为奇数大小的性质。通过分析得出,每个点的右子树大小必为偶数,且树必须由两棵较小的满足条件的二叉树构造而成。文章还提供了具体的构造算法。

正题

      Portal

      这题很有趣,首先一个点的两个子树肯定也是一棵满足条件的二叉树。

      其次,左儿子的右子树大小为偶数,右儿子的左子树大小为奇数。

      我们来从第二条性质推一推:右儿子的左子树大小为奇数说明右儿子去掉其右子树后大小为偶数,其右儿子也满足左子树的大小为奇数,说明对于一条右儿子链上的点(这里的右儿子链指的是在某个点不断往其右儿子走知道没有右儿子的链),他们和他们的左儿子大小之和分别都为偶数。那么我们就可以得到一个结论:每个点的右子树大小必为偶数。

      还有另一个条件,就是这棵二叉树一定是一棵均衡二叉树。

      那么一个新的二叉树,它既要满足左右子树满足条件,又要均衡二叉树,它就必须由两棵比它深度小1的满足条件的二叉树构造而来。

      注意这里的深度指的是均衡二叉树中最大满二叉树的深度。

      深度为1的显然只有两个1,2,从深度为2开始考虑,先放一个根节点,在左边和右边都接一个1节点,发现不满足条件,因为根节点的右子树为奇数,那么我们直接在根的后继加一个左儿子就行了,这样不影响其他任何的右子树。

      那么我们就构造了一棵点数为4的一棵二叉树,发现第一个点可以加或不加一个左儿子,也就是说5也是可行的。

      构造下一棵树的时候,可以尝试用直接将奇数放左边,偶数放右边,然后让第一个点的左儿子可有可无,那么就完成了构造。

#include<bits/stdc++.h>
using namespace std;
 
int n;
 
int main(){
	scanf("%d",&n);
	int x=1;
	while(x<=n){
		if(x==n || x+1==n) {
			printf("1");
			return 0;
		}
		if(x&1) x=x+1+x+1;
		else x=x+1+x;
	}
	printf("0");
}

 

需求响应动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)内容概要:本文围绕需求响应动态冰蓄冷系统及其优化策略展开研究,结合Matlab代码实现,探讨了在电力需求侧管理背景下,冰蓄冷系统如何通过优化运行策略参与需求响应,以实现削峰填谷、降低用电成本和提升能源利用效率的目标。研究内容包括系统建模、负荷预测、优化算法设计(如智能优化算法)以及多场景仿真验证,重点分析不同需求响应机制下系统的经济性和运行特性,并通过Matlab编程实现模型求解与结果可视化,为实际工程应用提供理论支持和技术路径。; 适合人群:具备一定电力系统、能源工程或自动化背景的研究生、科研人员及从事综合能源系统优化工作的工程师;熟悉Matlab编程且对需求响应、储能优化等领域感兴趣的技术人员。; 使用场景及目标:①用于高校科研中关于冰蓄冷系统与需求响应协同优化的课题研究;②支撑企业开展楼宇能源管理系统、智慧园区调度平台的设计与仿真;③为政策制定者评估需求响应措施的有效性提供量化分析工具。; 阅读建议:建议读者结合文中Matlab代码逐段理解模型构建与算法实现过程,重点关注目标函数设定、约束条件处理及优化结果分析部分,同时可拓展应用其他智能算法进行对比实验,加深对系统优化机制的理解。
### Height-Balanced Binary Tree 与 Self-Balanced Binary Tree 的区别 **Height-Balanced Binary Tree** 是一种二叉树,其定义为:对于树中的每个节点,其左右子树的深度之差不超过1。这种平衡性确保了树的整体高度保持在 $ O(\log n) $ 级别,从而保证了查、插入和删除操作的时间复杂度接近最优。例如,在 LeetCode 题目中,判断一棵二叉树是否是高度平衡的通常涉及递归计算每个节点的左右子树深度,并检查它们的差异[^1]。 **Self-Balanced Binary Tree** 则是一个更广泛的概念。它不仅要求树的高度平衡,还要求在进行插入或删除操作后,树能够通过特定的旋转操作(如左旋、右旋)自动恢复平衡。常见的自平衡二叉搜索树包括 AVL 树 和 红黑树(Red-Black Tree)。AVL 树是一种特殊的高度平衡二叉搜索树,其每个节点的左子树和右子树的高度差最多为1,并且所有操作(插入、删除)都会维持这一性质;而红黑树则通过颜色规则来保证树的大致平衡,虽然它的高度可能略高于 AVL 树,但其插入和删除操作的性能更好[^3]。 #### 关键区别 1. **定义上的区别**: - Height-Balanced Binary Tree 只要求任意节点的左右子树深度差不超过1。 - Self-Balanced Binary Tree 不仅要求高度平衡,还需要支持动态操作(插入、删除)后的自动平衡维护。 2. **应用场景**: - Height-Balanced Binary Tree 通常用于静态结构或不需要频繁更新的场景。 - Self-Balanced Binary Tree 更适合需要频繁插入和删除的动态数据结构,例如数据库索引和语言标准库中的有序集合。 3. **实现机制**: - Height-Balanced Binary Tree 的实现较为简单,只需检查每个节点的子树深度差即可。 - Self-Balanced Binary Tree(如 AVL 树)则需要额外的旋转操作来维持平衡,例如 AVL 树的单旋转和双旋转[^3]。 4. **性能特性**: - 在查操作较多的情况下,Height-Balanced Binary Tree 和 Self-Balanced Binary Tree 的性能相近。 - 在插入和删除操作较多的情况下,Self-Balanced Binary Tree(如红黑树)通常表现更好,因为它们的平衡策略减少了旋转的次数。 ### 示例代码:AVL 树的插入操作 以下是一个 AVL 树的插入操作示例,展示了如何通过旋转保持树的平衡: ```cpp struct Node { int key; Node *left; Node *right; int height; }; int height(Node *N) { if (N == NULL) return 0; return N->height; } Node* newNode(int key) { Node* node = new Node(); node->key = key; node->left = NULL; node->right = NULL; node->height = 1; return node; } Node* rightRotate(Node *y) { Node *x = y->left; Node *T2 = x->right; x->right = y; y->left = T2; y->height = max(height(y->left), height(y->right)) + 1; x->height = max(height(x->left), height(x->right)) + 1; return x; } Node* leftRotate(Node *x) { Node *y = x->right; Node *T2 = y->left; y->left = x; x->right = T2; x->height = max(height(x->left), height(x->right)) + 1; y->height = max(height(y->left), height(y->right)) + 1; return y; } int getBalance(Node *N) { if (N == NULL) return 0; return height(N->left) - height(N->right); } Node* insert(Node* node, int key) { if (node == NULL) return newNode(key); if (key < node->key) node->left = insert(node->left, key); else if (key > node->key) node->right = insert(node->right, key); else return node; node->height = 1 + max(height(node->left), height(node->right)); int balance = getBalance(node); if (balance > 1 && key < node->left->key) return rightRotate(node); if (balance < -1 && key > node->right->key) return leftRotate(node); if (balance > 1 && key > node->left->key) { node->left = leftRotate(node->left); return rightRotate(node); } if (balance < -1 && key < node->right->key) { node->right = rightRotate(node->right); return leftRotate(node); } return node; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值