**
数组转二叉树存储中,如何确认二对树存储数组的长度?
**
数组转二叉树存储,很多算法书上或或网上的例题,换几个数字,程序莫名其妙的卡死,运行不了。问题出在哪儿呢?
问题出在数组btree越界了。
因为没有考虑到二叉树只有左子树的情况,导致二叉树存储时,btree数组需求太大,超过了你为btree数组开辟的空间,从而导致数组越界,而出现卡死或乱码的情况。
解决办法:正确确立btree数组的长度。
如下题所示,数组data转二叉树存储后为6层, 所以btree数组大小至少为2^6=64。实际工作中,应避免只有左子树的情况出现,(只有左子树时可以重新选用根结点上的数据进行调整),应尽量缩短二叉树的层数,防止栈空间被拉爆,电脑变成暖宝宝!
而不是用data的length随便加上一个数作为btree的长度,那是不负责任的忽悠小白。
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
//目的:把数组中的数据转入新的数组,按二叉树逻辑结构存储
//用递归与循环二种方法实现。
//其实也成了二叉搜索树(二叉排序、查找树)
//数组转二叉树存储
void Btree_create(int *btree,int *data,int length) {
int i,level;
for(i=0; i<length; i++) {
for(level=1; btree[level]!=0;) {
if(data[i]>btree[level])
level=level*2+1; //向右遍历
else
level=level*2;//向左遍历
}
btree[level]=data[i];
}
}
//中序遍历
void inOrder(int *btree,int root,int len) {
if (root >= len) return; //超出范围,返回
inOrder(btree,root * 2,len); //访问左子树
if(btree[root]!=0)
cout << btree[root] << " "; //访问根节点
inOrder(btree,root * 2 + 1,len); //访问右子树
}
//下面为按二叉树层次遍历
void Btreeprint(int*tree,int len) {
cout<<"\n\n====下面为按二叉树层次遍历===== "<<endl;
int g=0;
int n=len;
int m=0;//记数用
int size =len;
int number=0; //打印空格之用
for(int i=1; size!=0; i=g) {
g=i*2;//左子的索引 从下标1开始,则 左子树为2*i
if(number==0) //打印空格
printf(" ");
else if(number==1)
printf(" ");
else if(number==2)
printf(" ");
else if(number==3)
printf(" ");
else if(number==4)
printf(" ");
else if(number==5)
printf(" ");
number++;
for(int q=i; q<g; q++) {
m++;//记数
size--;
if(tree[q]!=0)
printf("%d ", tree[q]);
if(tree[q]==0&&m<=16)
printf(" * ");
if(m==n)
break;
}
printf("\n");
}
}
int main() {
int data[]= {6,3,5,9,7,8,4,2,80,600,40,30,111,897,20,556};
int length=sizeof(data)/sizeof(data[0]);//10
cout<<"原始数组长度:length="<<length<<endl;
int btree[100]= {0}; //一定要初始化,为函数中的判断提供依据。
cout<<"原数组:"<<endl;
for(int i=0; i<length; i++)
cout<<data[i]<<" ";
cout<<"\n\n======数组树在数组中的分布========="<<endl;
Btree_create(btree,data,length);
for(int i=1; i<64; i++) {
printf("%5d",btree[i]);
if(i%20==0)
cout<<endl;
}
cout<<"\n\n======层次遍历数组========="<<endl;
for(int i=1; i<64; i++) {
if(btree[i]!=0)
cout<<btree[i]<<" ";
}
cout<<"\n\n=====中序遍历(0不显示)=========="<<endl;
inOrder(btree,1,64);
Btreeprint(btree, 64);
return 0;
}