对以下代码进行优化:typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right;} TreeNode;// 创建新节点TreeNode* createNode(int val) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node;}// 将数组按层次遍历方式插入二叉树中TreeNode* insertLevelOrder(int arr[], TreeNode* root, int i, int n) { if (i < n) { TreeNode* temp = createNode(arr[i]); root = temp; root->left = insertLevelOrder(arr, root->left, 2 * i + 1, n); root->right = insertLevelOrder(arr, root->right, 2 * i + 2, n); } return root;}// 初始化二叉树TreeNode* initTree(int arr[], int n) { TreeNode* root = NULL; root = insertLevelOrder(arr, root, 0, n); return root;}
时间: 2023-06-07 12:07:50 浏览: 105
这个代码本身已经非常优雅和简洁了,但我认为可以尝试以下三种优化:
1.将 createNode() 函数内部的 malloc() 和 memset() 合并成一个 calloc() 函数调用,可以减少对堆的访问次数,从而提高性能。
2. 在 insertLevelOrder() 函数中,每次都要执行一个取模操作和两个乘法操作。这些操作可以移动到循环外部以减少重复计算和提高性能。
3. 对于大型输入,使用动态内存分配可以提高效率。可以使用 realloc() 函数来动态增加节点数组的大小,而不是最初声明足够大的数组。
优化后的代码如下:
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建新节点
TreeNode* createNode(int val) {
TreeNode* node = calloc(1, sizeof(TreeNode));
node->val = val;
return node;
}
// 将数组按层次遍历方式插入二叉树中
TreeNode* insertLevelOrder(int arr[], TreeNode* root, int i, int n) {
while (i < n) {
TreeNode* temp = createNode(arr[i]);
root = (root == NULL) ? temp : root;
root->left = insertLevelOrder(arr, root->left, 2 * i + 1, n);
root->right = insertLevelOrder(arr, root->right, 2 * i + 2, n);
return root;
}
return NULL;
}
// 初始化二叉树
TreeNode* initTree(int arr[], int n) {
TreeNode* root = insertLevelOrder(arr, NULL, 0, n);
return root;
}
阅读全文