簡體   English   中英

深度優先搜索和創建數組的問題

[英]Problem with deepth first search and create array

我最近開始在 c 上編程,我的代碼有問題。 給定二叉樹的根,我需要返回其節點值的先前遍歷。 這是我現在的代碼。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
void dfs(struct TreeNode *root, int *ans);

int *preorderTraversal(struct TreeNode *root, int *returnSize) {
    int *ans = malloc(10 * sizeof(int));
    dfs(root, ans);
    *returnSize = 10;
    return ans;
}

void dfs(struct TreeNode *root, int *ans) {
    if (root == NULL)
        return ;
    ans[0] = root->val;
    dfs(root->left, ans);
    dfs(root->right, ans);
}

我知道它看起來很糟糕而且根本不起作用,所以我有幾個問題:

  • 創建一個數組,我需要指定他的長度,但是我真的不明白我是怎么弄到的。
  • 也可以在不創建數組的情況下執行此代碼嗎?
  • 我應該如何將 root->val 和它后面的所有其他元素添加到數組中。

鑒於:

#define UNUSED( x ) (void)( x )

typedef struct Node {
   int val;
   struct Node *left;
   struct Node *right;
} Node;

typedef void (*Visitor)( Node *, void * );

void dfs( Node *node, Visitor visitor, void *param ) {
   if ( !node )
      return;

   dfs( node->left,  visitor, param );
   dfs( node->right, visitor, param );

   visitor( node, param );
}

方案一:兩次遍歷

typedef struct {
   size_t i;
   int *a;
} AppendVisitorData;

void counter_visitor( Node *node, void *param ) {
   UNUSED( node );
   size_t *count_ptr = param;

   ++*count_ptr;
}

void append_visitor( Node *node, void *param ) {
   AppendVisitorData *data = param;

   data->a[ data->i++ ] = node->val;
}

int doit( Node *node, size_t *n_ptr, int **a_ptr ) {
   dfs( node, counter_visitor, n_ptr );

   *a_ptr = malloc( *n_ptr * sizeof( int ) );

   AppendVisitorData data = {
      .i = 0,
      .a = *a_ptr,
   };

   dfs( node, append_visitor, &data );

   return 0;
}

解決方案 2:增長數組

typedef struct {
   size_t n;
   size_t i;
   int *a;
} AppendVisitorData;

void append_visitor( Node *node, void *param ) {
   AppendVisitorData *data = param;

   if ( data->i == data->n ) {
      if ( data->n ) 
         data->n *= 2;
      else
         data->n = 8;

      data->a = realloc( data->a, data->n * sizeof( int ) );
   }

   data->a[ data->i++ ] = node->val;
}

int doit( Node *node, size_t *n_ptr, int **a_ptr ) {
   AppendVisitorData data = {
      .n = 0,
      .i = 0,
      .a = NULL,
   };

   dfs( node, append_visitor, &data );

   *a_ptr = realloc( data.a, data.i * sizeof( int ) );
   *n_ptr = data.i;
   return 0;
}

錯誤檢查留給用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM