【问题标题】:Convert binary tree to array in c在c中将二叉树转换为数组
【发布时间】:2015-06-17 09:53:26
【问题描述】:

我想使用 C 将二叉树转换为数组。我试过但不成功。

我的二叉树包含以下元素(预购)

4 3 5 10 8 7

但我的数组包含(排序后)

4 4 5 7 8 10

任何帮助将不胜感激。我当前的代码如下所示:

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

typedef struct tree
{
    int data;
    struct tree *left;
    struct tree *right;
}tree;

int AddToArray(tree *node, int arr[], int i);
tree *CreateNode(int data);
tree *Insert(tree *node, int data);
void PrintPreorder(tree *node);
int count(tree *node);
int compare(const void * a, const void * b);

//---------------------------------------------------------------------------
int main()
{
    int i;
    int size;
    int *arr=NULL;
    tree *root=NULL;

    printf("***TEST PROGRAM***\n");
    root = Insert(root, 4);
    root = Insert(root, 3);
    root = Insert(root, 5);
    root = Insert(root, 10);
    root = Insert (root, 8);
    root = Insert (root, 7);
    size = count(root);

    printf("\n***BINARY TREE (PREORDER)***\n");
    PrintPreorder(root);
    printf("\nThe binary tree countain %d nodes", size);

    printf("\n\n***ARRAY***\n");
    arr = calloc(size, sizeof(int));
    AddToArray(root, arr, 0);
    qsort(arr,size,sizeof(int),compare);

    for (i=0; i<size; i++)
    {
        printf("arr[%d]: %d\n", i, arr[i]);
    }
}
//---------------------------------------------------------------------------

int compare(const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int AddToArray(tree *node, int arr[], int i)
{
    if(node == NULL)
        return i;
     arr[i] = node->data;
     i++;
     if(node->left != NULL)
          AddToArray(node->left, arr, i);
     if(node->right != NULL)
          AddToArray(node->right, arr, i);

     arr[i] = node->data;
     i++;
}

tree *CreateNode(int data)
{
    tree *node = (tree *)malloc(sizeof(tree));
    node -> data = data;
    node -> left = node -> right = NULL;
    return node;
}

tree *Insert(tree *node, int data)
{
    if(node==NULL)
    {
        tree *temp;
        temp = CreateNode(data);
        return temp;
    }

    if(data >(node->data))
    {
        node->right = Insert(node->right,data);
    }
    else if(data < (node->data))
    {
        node->left = Insert(node->left,data);
    }

    /* Else there is nothing to do as the data is already in the tree. */
    return node;
}

void PrintPreorder(tree *node)
{
    if(node==NULL)
    {
        return;
    }
    printf("%d ",node->data);
    PrintPreorder(node->left);
    PrintPreorder(node->right);
}

int count(tree *node)
{
    int c = 1;

    if (node == NULL)
        return 0;
    else
    {
        c += count(node->left);
        c += count(node->right);
        return c;
     }
}

【问题讨论】:

    标签: c arrays tree binary-tree preorder


    【解决方案1】:
    int TreeToArray (struct node *tree, int *arr, int i)
    
    {
        if (tree == NULL) return i;
    
        if (tree->left != NULL) i = TreeToArray(tree->left, arr, i);
        arr[i] = tree->Value;
        i++;
        if (tree->right != NULL) i = TreeToArray(tree->right, arr, i);
    
        return i;
    }
    

    【讨论】:

      【解决方案2】:

      因为i没有统一处理。

      AddToArray 替换为

      void AddToArray(tree *node, int arr[], int *i){
          if(node == NULL)
              return ;
      
          arr[*i] = node->data;
          ++*i;
          AddToArray(node->left, arr, i);
          AddToArray(node->right, arr, i);
      }
      

      并在 main 处致电 i=0; AddToArray(root, arr, &amp;i);

      【讨论】:

        【解决方案3】:

        两行代码intAddToArray

         arr[i] = node->data;
         i++;
        

        在每个递归级别出现两次。我的猜测是树中的每个值都被写入数组两次,并且它们相互重叠。但根是要写入两次的最终值,所以它是唯一值得注意的。

        只需删除函数底部的重复调用即可。

        【讨论】:

          【解决方案4】:

          将您的 AddToArray 方法更改为:

          int AddToArray(tree *node, int arr[], int i)
          {
               if(node == NULL)
                    return i;
          
          
               arr[i] = node->data;
               i++;
               if(node->left != NULL)
                    i = AddToArray(node->left, arr, i);
               if(node->right != NULL)
                    i = AddToArray(node->right, arr, i);
          
               return i;
          }
          

          发生的情况是您的递归调用正在更改 i 的值(您应该插入以下元素的索引),但您的递归并未在迭代中更改 i 的值实际上调用了递归。使用AddToArray 返回的值更新i 可以解决此问题。

          【讨论】:

          • 完美的答案兄弟太好了
          猜你喜欢
          • 2015-05-07
          • 1970-01-01
          • 2023-03-18
          • 2013-04-17
          • 1970-01-01
          • 2020-08-24
          • 1970-01-01
          • 2012-02-28
          • 2011-07-24
          相关资源
          最近更新 更多