[英]I want to convert an array represeantation of left balanced binary tree from In-order to Level order representation:
如下图所示,我有一个程序来按顺序存储树的数据。
例如: A[7]={0,1,2,3,4,5,6};
我希望以级别顺序的方式进行转换:这样第一个节点是根,可以在2i + 1位置找到左子节点,在2i + 2位置找到右子节点,并且任何节点的父节点都可以在第i / 2个位置找到。
即:
B[0]=A[3]
B[1]=A[1]
B[2]=A[5]
B[3]=A[0]
B[4]=A[2]
B[5]=A[4] and
B[6]=A[6]
我陷入困境,无法找到任何策略。
我需要执行此操作,以为我之前编写的算法创建兼容的树结构。
数据集包含数千个节点,因此无法手动进行。 请为此提出一种迭代或递归算法。
谢谢。
虽然信心不大...
#include <stdio.h>
void toOrder(int a[], int b[], size_t index, size_t size, size_t a_size){
int i;
if(index >= a_size) return;
if(size == 1){
b[index] = a[0];
return;
}
size /=2;
b[index]=a[size];
toOrder(&a[0] , b, index * 2 + 1, size, a_size);
toOrder(&a[size+1], b, index * 2 + 2, size, a_size);
}
#define SIZE 7
int main(void){
int a[SIZE] = {0,1,2,3,4,5,6};
int b[SIZE];
int i;
toOrder(a, b, 0, SIZE, SIZE);
for(i=0;i<SIZE;++i)
printf("b[%d]=%d\n", i, b[i]);
printf("\n");
return 0;
}
这是一种算法,先进行一次记录保持扫描,然后进行一次输出。
取树大小为n的数组。
创建大小为depth的记录保持数组深度 ,深度初始化为0。每个条目是深度i处有多少个节点。
在树上行走,注意每个节点的深度。 在每个节点上:
depths[d] += 1
这将为您提供每个深度有多少个节点的列表。
制作一个新的数组depth-offset 。 其中depth-offset [i] = depth-offset [i-1] + depths [i-1]和depth-offset [0] =0。这显示给定深度的节点在输出数组中的起始位置。 现在只需要走动和放置,同时在该级别增加下一个节点的位置即可。
按顺序行走树,再次注意深度。
offset = depth-offset[d]
output[offset] = value-at-node
depth-offset[d] = depth-offset[d]+1
输出应该是您的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.