TreeNode* CreateNode(MapPoint a) {//创建树的结点 TreeNode* pNew = new TreeNode;//开内存 //memset(pNew, 0, sizeof(TreeNode)); pNew->pos = a; return pNew; }
时间: 2023-06-25 17:06:55 浏览: 65
这段代码是用来创建一个树结点的函数。它接受一个 MapPoint 类型的参数 a,表示要创建结点的位置。函数返回一个指向新创建的结点的指针。
函数首先使用 new 操作符分配一个新的 TreeNode 对象的内存空间,并将其地址赋值给 pNew 指针。然后将结点的 pos 成员变量设置为参数 a 的值。最后将指向新结点的指针 pNew 返回。注意,这个函数没有对新结点的其他成员变量进行初始化,需要在其他地方进行初始化或者使用类构造函数进行初始化。
相关问题
对以下代码进行优化: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;}
这个代码本身已经非常优雅和简洁了,但我认为可以尝试以下三种优化:
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;
}
#include <stdio.h> #include <stdlib.h> // 二叉树结点的定义 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;}; // 创建新结点 struct TreeNode *createNode(int val) { struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node;} // 合并两棵二叉树 struct TreeNode *mergeTrees(struct TreeNode *t1, struct TreeNode *t2) { if (!t1 && !t2) { return NULL; } else if (!t1) { return t2; } else if (!t2) { return t1; } struct TreeNode *root = createNode(t1->val + t2->val); root->left = mergeTrees(t1->left, t2->left); root->right = mergeTrees(t1->right, t2->right); return root;} // 层次遍历二叉树 void levelOrder(struct TreeNode *root) { if (!root) { return; } // 创建队列 struct TreeNode **queue = (struct TreeNode **)malloc(sizeof(struct TreeNode *) * 1000); int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { struct TreeNode *node = queue[front++]; printf("%d ", node->val); if (node->left) { queue[rear++] = node->left; } if (node->right) { queue[rear++] = node->right; } } free(queue);}int main() { struct TreeNode *t1 = createNode(1); t1->left = createNode(3); t1->right = createNode(2); t1->left->left = createNode(5); struct TreeNode *t2 = createNode(2); t2->left = createNode(1); t2->right = createNode(3); t2->left->right = createNode(4); t2->right->right = createNode(7); struct TreeNode *root = mergeTrees(t1, t2); printf("合并后的二叉树:"); levelOrder(root); printf("\n"); return 0; }解释每行代码
行1:包含标准输入输出库的头文件
行2:包含动态内存分配库的头文件
行4-9:定义二叉树结点的结构体,包含结点值、左右子树指针
行11-17:创建新的二叉树结点,返回结点指针
行19-33:合并两棵二叉树的函数,如果都为空则返回NULL,如果有一棵为空则返回非空的那棵,否则创建新的结点,值为两棵树对应结点的值之和,左右子树递归调用函数合并
行35-53:层次遍历二叉树的函数,如果根节点为空则直接返回,创建长度为1000的队列,队列初始化为空,将根节点加入队列,当队列不为空时,取出队首元素,输出其值,如果左右子树非空,则将左右子树加入队列。最后释放队列内存。
行55-64:主函数,创建两棵二叉树,分别为t1和t2,合并两棵树得到新的根节点,输出合并后的二叉树,调用层次遍历函数输出每个结点的值。
以上是代码的行数和每行的解释。
阅读全文