04-树6 Complete Binary Search Tree
来源:互联网 发布:网络舆情办理 编辑:程序博客网 时间:2024/06/14 04:25
第一种常规解法,由搜索二叉树中序遍历结构构造树
这里用数组表示树就可以了,不用链表,因为是完全二叉树,用数组不会浪费空间,而且层序遍历按下表访问就可以了,不用像链表一样要借助队列
#include<stdio.h>#include<stdlib.h>#include<math.h>#define MAX 1000int T1[MAX],T2[MAX];int compare(const void *a,const void *b){ return *(int *)a-*(int *)b;}int GetLeft(int n)//左子树节点个数{ int H,x,L;//H树的高度,x为底层叶节点个数,L时左子树节点数 H=floor((float)log10(n+1)/log10(2));//floor返回不大于里面值得最大正整数 x=n+1-pow(2,H); if(x>pow(2,H-1)) x=pow(2,H-1); L=pow(2,H-1)-1+x; return L;}void solve(int left,int right,int root)//建立层序遍历树{ int leftroot,rightroot,n,L; n=right-left+1; if(0==n) return; L=GetLeft(n); T2[root]=T1[left+L]; leftroot=2*root+1;//左子树根节点 rightroot=leftroot+1;//右子树根节点 solve(left,left+L-1,leftroot);//遍历左子树 solve(left+L+1,right,rightroot);//遍历右子树}int main(){ int i,N; scanf("%d",&N); for(i=0;i<N;i++) scanf("%d",&T1[i]); qsort(T1,N,sizeof(int),compare); solve(0,N-1,0);//根节点初始为0 for(i=0;i<N-1;i++) printf("%d ",T2[i]); printf("%d\n",T2[i]); return 0;}
第二种方法
基本想法是这样,完全二叉树有这么一个性质,若a节点的下标为i,那么它左儿子的下标为2i,右儿子为2i+1. 而这个下标则为完全二叉树在层序遍历时的输出顺序。而对于任意一棵搜索树,其中序遍历的输出,是一个递增的数列。根据这两个性质,可以有如下算法。
首先,将输入的数列递增排序,会用到qsort函数。这样,得到了所求的完全二叉搜索树的中序遍历输出,得到数组a[i]。接着,根据总的节点个数,将这个完全二叉搜索树的层序遍历的顺序(或者下标),中序遍历输出,得到数组b[i]。则对该完全二叉搜索书的层序遍历的解 c[ b[i] ]=a[i].
如果太抽象,可以这么理解。我现在有一棵完全的二叉搜索树,每个节点上除了 data,left以及right以外,还有一个flag,用来记录他是第几个元素(按照层序遍历的顺序)。现在我有它的中序遍历的输出,那么,只要在这个中序遍历的输出里面,按照每个节点对应的层序遍历的flag,输出,就是层序遍历的输出值了。
对于如何中序的输出层序遍历的顺序,可以参考如何中序的输出节点。类比得:终止条件,输入的 i 大于总的元素数N。递归的顺序,root的顺序是i,则先让2i入递归,然后输出i,接着让2i+1入递归。
#include <stdio.h> #include <stdlib.h> #define MAX 1001 int b[MAX]; int j=0; int compare(const void * a, const void * b); void mid_tre(int root,int N,int a[]); int main(){ int N; int i=0; int a[MAX]; scanf("%d",&N); for(i=0;i<N;i++){ scanf("%d",&a[i]); } qsort(a,N,sizeof(int),compare); mid_tre(1,N,a); printf("%d",b[1]); for(i=2;i<=N;i++){ printf(" %d",b[i]); } } int compare(const void * a, const void * b) { return *(int *)a - *(int *)b; } void mid_tre(int root,int N,int a[])//构造完全二叉树的时候按中序构造 { if(root<=N){ mid_tre(2*root,N,a); b[root]=a[j++]; mid_tre(2*root+1,N,a); } }
0 0
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree
- 04-树5. Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree (30分)
- PTA 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree (30分)
- 04-树6 Complete Binary Search Tree (30分)
- 04-树6 Complete Binary Search Tree (30分)
- 04-树6 Complete Binary Search Tree
- 04-树6 Complete Binary Search Tree (30分)
- 04-树6 Complete Binary Search Tree (30分)
- 42.在应用中打开别的应用
- Java对象序列化与反序列化
- VisualSVN 切换工作目录
- 2016多校联合第二场
- 看病要排队
- 04-树6 Complete Binary Search Tree
- iOS runloop 创建一个和App生命周期相同的线程
- 欢迎使用CSDN-markdown编辑器
- POJ1328贪心算法
- 我的Android进阶之旅------>解决Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.g
- Educational Codeforces Round 13 E 状压dp
- 利用XShell上传、下载文件(使用sz与rz命令),超实用!
- CSS预处理技术总结(一)Less
- HDU1542——Atlantis(扫描线,线段树,矩形面积并,离散化)