当前位置: 首页 > news >正文

【2025年清华计算机考研826算法题】

2025年清华计算机考研826算法题

题目

算法题设计与分析(7+1+5+1=14分)
二叉树节点定义如下:

struct BinNode{int data;BstNode *lc,*rc;BstNode *parent;
}

均由n个节点组成的两棵二叉树VU,若其节点可以分别用1到n之间的整数编号,且每一对编号相等的节点v∈Vu∈U,都满足v->parentu->parent均为NULL或者编号相等,则成vu弱同构,进一步地,若还满足v->lcu->lc均为NULL或者编号相等且v->rcu->rc均为NULL或者编号相等,则称VU强同构.
(1)完成以下算法:

//以x为根的二叉树中,共有data域互异的n个节点
void heapify(BinNode *x){
//在O(nlogn)时间内,将其转化为与之强同构的大根堆
}

(2)试说明你的heapify()算法时间复杂度满足要求.

(3)接下来递归地定义二叉树节点的npl值如下:
对于空节点NULL,npl(NULL) =0
对于非空节点v,npl(v)=1+min{npl(v->lc),npl(v->rc)}
若堆中的每个非空节点v,都满足npl(v)=1+npl(v->rc),则称之为左式堆
完成如下算法:

//以x为根的大顶堆中,共有data域互异的n个节点
void leftify(BinNode *x){
//在O(n)时间内,将其转化为与之弱同构的左式堆
}

(4)试说明你的leftify()算法时间复杂度满足要求

解答

(1)算法代码

//考试的代码当然不用写这么多,这里我是为了测试用的
#include <iostream>
#include <vector>using namespace std;struct BinNode {int data;BinNode *lc, *rc;BinNode *parent;BinNode(int val) : data(val), lc(NULL), rc(NULL), parent(NULL) {}
};// 完成数据收集,O(n)
void getData(BinNode* node, vector<int>& data) {if (node == NULL) return;data.push_back(node->data);  getData(node->lc, data);getData(node->rc, data);
}// 归并,O(n)
void merge(vector<int>& arr, int lo, int mid, int hi) {int n1 = mid - lo + 1;int n2 = hi - mid;vector<int> L(arr.begin() + lo, arr.begin() + mid + 1);vector<int> R(arr.begin() + mid + 1, arr.begin() + hi + 1);int i = 0, j = 0, k = lo;while (i < n1 && j < n2) {arr[k++] = (L[i] <= R[j]) ? L[i++] : R[j++];}while (i < n1) arr[k++] = L[i++];while (j < n2) arr[k++] = R[j++];
}// 归并排序,O(nlogn)
void mergeSort(vector<int>& arr, int lo, int hi) {if (lo < hi) {int mid = lo + (hi - lo) / 2;mergeSort(arr, lo, mid);mergeSort(arr, mid + 1, hi);merge(arr, lo, mid, hi);}
}// 先序遍历逆序赋值,构建大根堆,O(n)
void preOrderAssign(BinNode* node, const vector<int>& data, int& index) {if (node == NULL) return;node->data = data[data.size() - 1 - index];  // 从大到小取元素index++;preOrderAssign(node->lc, data, index);preOrderAssign(node->rc, data, index);
}// 主函数:转换为强同构大根堆,O(nlogn)
void heapify(BinNode* x) {if (x == NULL) return;vector<int> data;getData(x, data);  //完成数据收集int n = data.size();mergeSort(data, 0, n - 1);  // 对data进行归并排序int index = 0;preOrderAssign(x, data, index);  // 逆序先序遍历赋值,构建大根堆
}// 先序遍历打印(测试用)
void preOrderPrint(BinNode* node) {if (node == NULL) return;cout << node->data << " ";preOrderPrint(node->lc);preOrderPrint(node->rc);
}int main() {// 构建测试二叉树BinNode* root = new BinNode(3);root->lc = new BinNode(1);root->rc = new BinNode(2);root->lc->parent = root;root->rc->parent = root;root->lc->lc = new BinNode(5);root->lc->lc->parent = root->lc;root->rc->rc = new BinNode(4);root->rc->rc->parent = root->rc;cout << "转换前先序遍历: ";preOrderPrint(root);  // 输出:3 1 5 2 4heapify(root);cout << "\n转换后先序遍历: ";preOrderPrint(root);  // 输出:5 4 3 2 1// 释放内存delete root->lc->lc;delete root->rc->rc;delete root->lc;delete root->rc;delete root;return 0;
}

(2)说明时间复杂度

排序时间是O(nlogn),收集data的时间和先序遍历赋值的时间为都是O(n),总体的时间复杂度为O(nlogn)

(3)代码实现

void leftify(BinNode *x) {leftifyWithNpl(x);
}int leftifyWithNpl(BinNode *x) {if (x == NULL) return 0;int leftNpl = leftifyWithNpl(x->lc); // 递归处理左子树并获取nplint rightNpl = leftifyWithNpl(x->rc); // 递归处理右子树并获取npl// 如果右子树的npl大于左子树,交换左右子树if (rightNpl > leftNpl) {swap(x->lc, x->rc);      // 交换后npl值也需要交换swap(leftNpl, rightNpl);}return 1 + min(leftNpl, rightNpl); // 返回当前节点的npl
}

(4)说明时间复杂度

每个节点只被处理一次,每个节点的npl值只计算一次,复杂度为O(n)

http://www.dtcms.com/a/462473.html

相关文章:

  • 网上网城网站食品经营许可网站增项怎么做
  • 大模型前世今生(九):词向量汇聚为“大海”
  • 导购网站开发要多少钱个人网站不备案
  • com后缀的网站国际新闻最新消息今天大事件
  • Windows系统下MySQL 8.0详细安装教程
  • 【vLLM】源码解读:高性能大语言模型推理引擎的工程设计与实现
  • 网站seo优化有哪些陕西锦宇建设有限公司网站
  • Looper、MessageQueue、Message及Handler的关系是什么?如何保证MessageQueue的并发访问安全?
  • ELK运维之路(Elasticsearch7集群组建-7.17.24)
  • 网站建设管理工作总结室外平台设计
  • OpenShift Virtualization - 为使用 ovn-k8s-cni-overlay 类型网络的 VM 自动分配 IP 地址
  • 投资建设个什么网站好网络设计实践课程报告
  • 柳州住房和城乡建设局网站在深圳注册公司需要什么条件
  • Java 并发编程中的 CLH 队列
  • 客服AI软件如何成为电商店铺的“隐形增长官“
  • 世纪龙科技-汽车玻璃升降器更换及车门调整仿真教学软件介绍
  • 友达G156HAN04.0工业宽温液晶模组技术摘要
  • 推荐西安知名的集团门户网站建设公司南京调查公司网站
  • 国际化(货币单位、时间、数字)
  • next项目如何实现不同页面使用不同的布局结构,比如login不使用全局的layout
  • dnf游戏币交易网站建设网站app简单做
  • 服务器操作手册(四)nacos搭建+redis搭建+nexus搭建
  • LoadRunner2022 社区版下载及安装教程 + 中文版教程,内附安装包
  • CC防护的实时监控与响应机制
  • 长沙网站柯林建站程序
  • 唐山网站搭建wordpress 分页按钮 显示文章数
  • html怎么做网站地图卓越职业院校建设专题网站
  • Debezium日常分享系列之:使用 Debezium 添加新表:最佳实践和陷阱
  • flash个人网站源码西安是哪个省属于哪个市
  • 东莞h5网站开发网站内部链接是怎么做的