[英]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);
}
我知道它看起來很糟糕而且根本不起作用,所以我有幾個問題:
鑒於:
#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.