创建 post 顺序二叉树数组的函数
function to create array of post order binary tree
我正在尝试创建一个递归函数,该函数从给定树中创建一个 post 顺序整数数组。这是代码:
//structure
typedef struct node
{
// Each node holds a single integer.
int data;
// Pointers to the node's left and right children.
struct node *left, *right;
} node;
// preorder_recursive is same as postorder_recursive(), except
// array[i] comes before the recursive calls
int *postorder_recursive(node *root)
{
int *array = malloc(sizeof(node) * node_count(root)); // node_count(root) counts nodes in binary tree
int i = 0;
if (root == NULL)
return 0;
while (root != NULL)
{
postorder_recursive(root->left);
postorder_recursive(root->right);
array[i] = root->data;
i++;
}
return array;
}
// returns 1 if pre order = post order, returns 0 otherwise
int compare(node *a, node *b)
{
int i = 0;
int *preArray, *postArray;
if (node_count(a) != node_count(b))
return 0;
preArray = preorder_recursive(a);
postArray = postorder_recursive(b);
for (i = 0; i < node_count(a); i++)
{
if (preArray[i] != postArray[i])
return 0;
}
free(preArray);
free(postArray);
return 1;
}
我不完全确定错误是否出在这个函数中,但如果是,则可能是由于 while 循环。任何帮助都会很棒。
编辑:我包含了更多代码。这样做的目的是将 post 顺序数组与预排序数组进行比较。
您的函数 postorder_recursive()
每次调用时都会创建一个新数组。此外,while(root != NULL)
将永远循环非空树,如果不是因为它写入了 array
的末尾并在某些时候导致分段错误。
解决方案是将函数拆分为一个创建数组的函数,然后是另一个递归填充数组的函数,如下所示:
static size_t postorder_recursive(const node *root, int *array, size_t index) {
if (root == NULL)
return index;
index = postorder_recursive(root->left, array, index);
index = postorder_recursive(root->right, array, index);
array[index++] = root->data;
return index;
}
int *postorder_to_array(const node *root)
{
int *array = malloc(sizeof(node) * node_count(root));
postorder_recursive(root, array, 0);
return array;
}
我正在尝试创建一个递归函数,该函数从给定树中创建一个 post 顺序整数数组。这是代码:
//structure
typedef struct node
{
// Each node holds a single integer.
int data;
// Pointers to the node's left and right children.
struct node *left, *right;
} node;
// preorder_recursive is same as postorder_recursive(), except
// array[i] comes before the recursive calls
int *postorder_recursive(node *root)
{
int *array = malloc(sizeof(node) * node_count(root)); // node_count(root) counts nodes in binary tree
int i = 0;
if (root == NULL)
return 0;
while (root != NULL)
{
postorder_recursive(root->left);
postorder_recursive(root->right);
array[i] = root->data;
i++;
}
return array;
}
// returns 1 if pre order = post order, returns 0 otherwise
int compare(node *a, node *b)
{
int i = 0;
int *preArray, *postArray;
if (node_count(a) != node_count(b))
return 0;
preArray = preorder_recursive(a);
postArray = postorder_recursive(b);
for (i = 0; i < node_count(a); i++)
{
if (preArray[i] != postArray[i])
return 0;
}
free(preArray);
free(postArray);
return 1;
}
我不完全确定错误是否出在这个函数中,但如果是,则可能是由于 while 循环。任何帮助都会很棒。
编辑:我包含了更多代码。这样做的目的是将 post 顺序数组与预排序数组进行比较。
您的函数 postorder_recursive()
每次调用时都会创建一个新数组。此外,while(root != NULL)
将永远循环非空树,如果不是因为它写入了 array
的末尾并在某些时候导致分段错误。
解决方案是将函数拆分为一个创建数组的函数,然后是另一个递归填充数组的函数,如下所示:
static size_t postorder_recursive(const node *root, int *array, size_t index) {
if (root == NULL)
return index;
index = postorder_recursive(root->left, array, index);
index = postorder_recursive(root->right, array, index);
array[index++] = root->data;
return index;
}
int *postorder_to_array(const node *root)
{
int *array = malloc(sizeof(node) * node_count(root));
postorder_recursive(root, array, 0);
return array;
}