
作业社区
探索学习新天地,共享知识资源!
cjozGV 的学生作业:
练习1: #include "stdio.h" #include "stdlib.h" typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }TreeNode; //计算二叉树深度(递归方法) int maxDepth(TreeNode *root){ if (NULL == root){ return 0; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1; } // 创建新节点 TreeNode* createNode(int val){ TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->val = val; newNode->left = NULL; newNode->right = NULL; return newNode; } // 递归释放二叉树内存 void freeTree(TreeNode* node) { if (node == NULL) return; freeTree(node->left); //释放左子树 freeTree(node->right); //释放右子树 free(node); //释放当前节点 } int main(){ // 构建示例二叉树: // 1 // / \ // 2 3 // / \ // 4 5 TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); int depht = maxDepth(root); printf("二叉树深度: %d\n",depht); freeTree(root); return 0; } 练习2: #include #include typedef struct ListNode { int val; struct ListNode *next; } ListNode; ListNode* sort_linklist(ListNode *head) { if (!head || !head->next) return head; ListNode *dummy = (ListNode*)malloc(sizeof(ListNode)); dummy->next = head; ListNode *prev = dummy; ListNode *current = head; int swapped; do { swapped = 0; prev = dummy; current = dummy->next; while (current && current->next) { if (current->val > current->next->val) { ListNode *temp = current->next; // temp 指向 B current->next = temp->next; // A 的 next 指向 C(跳过 B) temp->next = current; // B 的 next 指向 A(B 现在 A 前面) prev->next = temp; // 前驱节点的 next 指向 B(新的当前节点) prev = temp; // 前驱节点指向 B swapped = 1; } else { prev = current; current = current->next; } } } while (swapped); ListNode *new_head = dummy->next; free(dummy); return new_head; } ListNode* create_node(int val) { ListNode *node = (ListNode*)malloc(sizeof(ListNode)); node->val = val; node->next = NULL; return node; } void print_list(ListNode *head) { ListNode *cur = head; while (cur) { printf("%d ", cur->val); cur = cur->next; } printf("\n"); } int main() { ListNode *head = create_node(4); head->next = create_node(2); head->next->next = create_node(1); head->next->next->next = create_node(3); printf("排序前: "); print_list(head); head = sort_linklist(head); printf("排序后: "); print_list(head); ListNode *cur = head; while (cur) { ListNode *temp = cur; cur = cur->next; free(temp); } return 0; } 练习3: #include "stdlib.h" #include "stdio.h" typedef struct linknode{ int val; //数据域 struct linknode *next; //指向下一个节点的指针next } linknode_t; linknode_t* merge_lists(linknode_t* head1,linknode_t* head2){ //1. 创建虚拟头节点(dummy) linknode_t dummy; //虚拟头节点 linknode_t* tail = &dummy; //尾指针,初始指向虚拟头节点 //2.新链表初始值为空 dummy.next = NULL; //虚拟头节点的next初始化为NULL; //3.遍历两个链表,直到其中一个为空 while (head1 != NULL && head2 != NULL){ //4.比较两个链表当前节点的值 if (head1->val < head2->val){ //5.将head1 当前节点追加到新链表末尾 tail->next = head1; //6.head1 移动到下一个节点 head1 = head1->next; } else { //7.将head2 当前节点追加到新链表末尾 tail->next = head2; //8.head2 移动到下一个节点 head2 = head2->next; } //9.tail 移动到新追加的节点(及新链表的末尾) tail = tail->next; } //10. 处理剩余节点(如果一个链表还未遍历完) tail->next = (head1 != NULL) ? head1 : head2; //11. 返回合并后的链表头节点(跳过虚拟头节点) return dummy.next; } //2.创建链表 linknode_t* create_list(int* arr,int size){ if (size == 0) return 0; //如果数组为空直接返回 linknode_t* head =(linknode_t*)malloc(sizeof(linknode_t)); head->val = arr[0]; //2.给头节点赋值数组的第一个元素 head->next = NULL; //3.头节点的next指针初始化为NULL linknode_t* current = head; //4.创建一个指针current,初始指向头节点 for (int i = 1;i < size;i++){ current->next = (linknode_t*)malloc(sizeof(linknode_t)); //6.为当前节点的next分配新节点 current = current->next; //7.current移动到新节点(准备给新节点赋值) current->val = arr[i]; //8.给新节点赋值为数组的当前元素 current->next = NULL; //9.新节点的next指针设为NULL(表示这是最后一个节点) } return head; } //打印链表 void print_list(linknode_t* head){ linknode_t* current = head; while (current != NULL){ printf("%d ",current->val); current = current->next; } printf("\n"); } //释放链表内存 void free_list(linknode_t* head){ linknode_t* current = head; while (current != NULL){ linknode_t* temp = current; current = current->next; free(temp); } } int main() { int arr1[] = {1, 3, 5, 7, 9}; int arr2[] = {2, 4, 6, 8, 10}; linknode_t* head1 = create_list(arr1, sizeof(arr1) / sizeof(arr1[0])); linknode_t* head2 = create_list(arr2, sizeof(arr2) / sizeof(arr2[0])); printf("List 1: "); print_list(head1); printf("List 2: "); print_list(head2); linknode_t* merged_head = merge_lists(head1, head2); printf("Merged List: "); print_list(merged_head); free_list(merged_head); return 0; } 练习4: 1.确定根节点: 先序遍历的第一个节点是根节点,即 A。 2.在中序遍历中找到根节点: 中序遍历中,根节点 A 将序列分为左子树和右子树: 左子树部分:G D H B 右子树部分:E I C F 3.递归构建左子树: 左子树的先序遍历:B D G H(先序中根节点后的部分,长度与中序左子树相同) 左子树的中序遍历:G D H B 根节点:B 中序中 B 分割为左:G D H,右:空 继续递归: 左子树的先序:D G H 左子树的中序:G D H 根节点:D 中序中 D 分割为左:G,右:H 因此,D 的左子是 G,右子是 H。 所以 B 的左子是 D,右子为空(因为中序中 B 右侧无节点)。 4.递归构建右子树: 右子树的先序遍历:C E I F 右子树的中序遍历:E I C F 根节点:C 中序中 C 分割为左:E I,右:F 继续递归: 左子树的先序:E I 左子树的中序:E I 根节点:E 中序中 E 分割为左:空,右:I 因此,E 的右子是 I。 右子树的先序:F 右子树的中序:F 根节点:F 所以 C 的左子是 E,右子是 F。 最终二叉树结构 A / \ B C / / \ D E F / \ \ G H I





daishuuuu 的学生作业:
#include using namespace std; class Test{ public: Test(int size){ // initialize index index = 0; data = new int[size]; length = size; } // delete array with [] ~Test(){ delete[] data; } void insert(int data){ this->data[index ++] = data; } void show(void){ for(int i = 0;i = length){ cout




