将二维数组呈现为树

Presenting 2D array as a tree

我有以下问题:

我有一个 n x n 整数数组,其中 n 是 2 的幂(1、2、4...)。我们可以想象整个数组(当n > 1时)被分成4块:

A B
D C

每块如果没有1个元素也可以类似的划分。我想将这个数组呈现为一棵树,其中每个节点都包含:

   a) integer, when the "square" cannot be divided futher
   or
   b) 4 nodes, corresponding to each piece: A,B,C,D

我有二维数组中的所有整数,我想编写一个函数来创建一棵树。到目前为止,我只设法创建了一个节点结构:

 struct node {
  int number;
  struct node *child[4];
};

问题是,我找不到遍历数组的方法,同时创建节点并为它们赋值。

你能用这个程序的伪代码支持我吗?

我建议您自下而上创建树的层:

  1. 首先创建一个 n x n 节点数组并将编号分配给节点。该数组将包含树的叶子。

  2. 然后创建一个新的二维节点数组,尺寸为 n/2 * n/2。对于每个节点,将原始数组的各个节点分配为子节点。因此,对于新数组中坐标为 (x,y) 的节点,您将分配子节点 (x*2,y*2)、(x*2+1,y*2)、(x*2,y* 2+1), 和 (x*2+1,y*2+1) 在旧数组中。

  3. 对新数组递归重复最后一步,直到数组的维度为 1 x 1。

因此,您最终得到一个代表树根的节点。

我想介绍一种自上而下的方法:

最好定义一个为您创建节点的函数。该函数负责递归地创建它自己的所有子项。

只有叶子会在其 int number; 字段中包含有价值的信息。

您将所有信息保存在二维数组中,并为树中的每个节点传入适当的上下 x 和 y 坐标。

这是描述我的方法的 C 代码:

#include <stdio.h>
#include <stdlib.h>

#define DIM 4


struct treeNode{
int number;
struct treeNode * A,*B,*C,*D;
//A top left,
//B top right
//C bottom right
//D bottom left
};
struct treeNode* createNode(int input[][DIM], int x1, int x2, int y1, int y2)
{
    struct treeNode * output = malloc(sizeof(struct treeNode));
    output->number=-1; //arbitrary value gets overwritten in leafs
    output->A=NULL;
    output->B=NULL;
    output->C=NULL;
    output->D=NULL;

    if(x1==x2)// single integer
    {
       output->number=input[x1][y1];
    }
    else
    {
    int midX = x1 + (x2-x1)/2;
    int midY = y1 + (y2-y1)/2;

    output->A = createNode(input,     x1, midX,     y1, midY);
    output->B = createNode(input,     x1, midX, 1+midY,   y2);
    output->C = createNode(input, 1+midX,   x2, 1+midY,   y2);
    output->D = createNode(input, 1+midX,   x2,     y1, midY);
    }
    return output;
};

由于您的树是动态分配的,因此您需要一种优雅的方式来递归释放内存:

void deleteTree(struct treeNode* t)
{
    if(t==NULL) return; //NULL passed in
    if(t->A==NULL) //leaf
    {
        free(t);
        return;
    }
    deleteTree(t->A);
    deleteTree(t->B);
    deleteTree(t->C);
    deleteTree(t->D);
    free(t);//free memory for pointer;
}

在你的 main 函数中你有:

int main()
{

    int A[DIM][DIM]={0};

    int i=0, counter=1;
    for(;i<DIM;++i)
    {
        int j=0;

        for(; j<DIM; ++j) A[i][j]=counter++;
    }
    struct treeNode* root = createNode(A,0,DIM-1,0,DIM-1);

    struct treeNode* nonLeaf = root->B;

    struct treeNode* leaf = nonLeaf->B;
    printf("%d", leaf->number);


    deleteTree(root);

    return 0;
}