正题
这题很有趣,首先一个点的两个子树肯定也是一棵满足条件的二叉树。
其次,左儿子的右子树大小为偶数,右儿子的左子树大小为奇数。
我们来从第二条性质推一推:右儿子的左子树大小为奇数说明右儿子去掉其右子树后大小为偶数,其右儿子也满足左子树的大小为奇数,说明对于一条右儿子链上的点(这里的右儿子链指的是在某个点不断往其右儿子走知道没有右儿子的链),他们和他们的左儿子大小之和分别都为偶数。那么我们就可以得到一个结论:每个点的右子树大小必为偶数。
还有另一个条件,就是这棵二叉树一定是一棵均衡二叉树。
那么一个新的二叉树,它既要满足左右子树满足条件,又要均衡二叉树,它就必须由两棵比它深度小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");
}
本文深入讨论了满足特定条件的二叉树构造方法,包括左子树为偶数大小,右子树为奇数大小的性质。通过分析得出,每个点的右子树大小必为偶数,且树必须由两棵较小的满足条件的二叉树构造而成。文章还提供了具体的构造算法。
1万+

被折叠的 条评论
为什么被折叠?



