C++笔试题深度分析 第五波 下
来源:互联网 发布:软件里程碑计划模板 编辑:程序博客网 时间:2024/05/24 03:44
2. 写一个函数,打印二叉树中某层的所有结点。
二叉树结点定义:
struct Node
{
int v;
Node* left;
Node* right;
};
函数原型:
void print_node_at_level(Node* node, int level)
说明:
将 level 层的结点中所保存的值打印在同一行。
#include <iostream>using namespace std;struct Node{int v;Node* left;Node * right;};void print_node_at_level(Node * node, int level){if(node != NULL){if(level == 0){cout<<node->v<<" ";}else{print_node_at_level(node->left,level -1);print_node_at_level(node->right,level -1);}}}int main(){Node nodes[] = { {0, NULL, NULL}, {1, NULL, NULL}, {2, NULL, NULL}, {3, NULL, NULL}, {4, NULL, NULL}, {5, NULL, NULL}, {6, NULL, NULL}, {7, NULL, NULL}, }; nodes[0].left = &nodes[1]; nodes[0].right = &nodes[2]; nodes[1].left = &nodes[3]; nodes[1].right = &nodes[4]; nodes[2].left = &nodes[5]; nodes[2].right = NULL; nodes[4].left = &nodes[6]; nodes[4].right = &nodes[7]; print_node_at_level(nodes, 3); cout<<endl;}
3. 编写一个函数用于删除二叉树中的度数为 1 的所有结点。
要求:
结点删除后其唯一的子结点替代它的位置。
#include <iostream>using namespace std;struct Node{ int v; Node* left; Node* right;};void print_div(int p){ for(int i=0; i<p; i++) { cout<<"-"; }}void print_tree(Node* node, int p){ if( node != NULL ) { print_div(p); cout<<node->v<<endl; if( (node->left != NULL) || (node->right != NULL) ) { print_tree(node->left, p+1); print_tree(node->right, p+1); } } else { print_div(p); cout<<endl; }}void print_tree(Node* node){ print_tree(node, 0);}void delete_one_degree_node(Node*& node){ if( node != NULL ) { if( (node->left != NULL) && (node->right != NULL) ) { delete_one_degree_node(node->left); delete_one_degree_node(node->right); } else if( (node->left != NULL) && (node->right == NULL) ) { node = node->left; delete_one_degree_node(node); } else if( (node->left == NULL) && (node->right != NULL) ) { node = node->right; delete_one_degree_node(node); } }}int main(){Node n[10] = {0};Node* tree = n;for(int i=0; i<10; i++){ n[i].v = i;}tree[0].left = &tree[1];tree[0].right = &tree[2];tree[1].left = &tree[3];tree[1].right = &tree[4];tree[2].left = NULL;tree[2].right = &tree[6];tree[3].left = &tree[7];tree[3].right = &tree[8];tree[4].left = &tree[9];cout<<"Original:"<<endl;print_tree(tree);delete_one_degree_node(tree);cout<<"After:"<<endl;print_tree(tree); return 0;}
4. 输入一个数组,数组里面可能有正数也有负数。数组中一个或连续的多个元素组成一个
子数组。求所有子数组的和的最大值。
要求:
时间复杂度为 O(n)。
解释:当前面的数字的和比后面的数字还小,就忽略前面的数字和
template<typename T>bool max_sub_array_sum(T array[], int len, T& max_sum){ int ret = (len > 0) && (array != NULL); if( ret ) { T sum = array[0]; T cur = array[0]; for(int i=1; i<len; i++) { cur = cur + array[i]; if( cur < array[i] ) { cur = array[i]; } if( cur > sum ) { sum = cur; } } max_sum = sum; } return ret;}
5. 在一个整型数组中只可能有 0,1,2 三种数字重复出现,编写一个函数对这样的数组进行
排序。
void three_element_sort(int array[], int len){ int* ts = new int[len]; int p = 0; if( ts != NULL ) { for(int i=0; i<3; i++) { for(int j=0; j<len; j++) { if( array[j] == i ) { ts[p++] = i; } } } for(int i=0; i<len; i++) { array[i] = ts[i]; } delete[]ts; }}void three_element_sort_ex(int array[], int len){ int p0 = 0; int p2 = len - 1; while( array[p0] == 0 ) p0++; while( array[p2] == 2 ) p2--; for(int i=p0; i<=p2;) { if( array[i] == 0 ) { swap(array[i], array[p0++]); while( array[p0] == 0 ) p0++; if( i < p0 ) i = p0; } else if( array[i] == 2 ) { swap(array[i], array[p2--]); while( array[p2] == 2 ) p2--; } else { i++; } }}
6. 求 1+2+3+…n 的和。
要求:
不能使用 if, while, for, switch, ?: 等条件语句,不能使用==, !=, <, <=, >, >=等比较运
算符,也不能调用外部库函数。只能使用加减法操作符,不能使用乘除法操作符。
#include <iostream>using namespace std;class Sum{private: static int N; static int S; Sum();public: static int Calculate(int n);};int Sum::N = 0;int Sum::S = 0;Sum::Sum(){ S = S + N; N = N - 1;}int Sum::Calculate(int n){ int ret = 0; Sum* p = NULL; N = n; S = 0; p = new Sum[N]; ret = S; delete[]p; return ret;}int main(){ cout<<Sum::Calculate(10)<<endl; cout<<Sum::Calculate(100)<<endl; return 0;}
0 0
- C++笔试题深度分析 第五波 下
- C++笔试题深度分析 第五波 上
- C++笔试题深度分析 第一波 下
- C++笔试题深度分析 第二波 下
- C++笔试题深度分析 第三波 下
- c++笔试题深度分析 第四波 下
- C++笔试题深度分析第一波 上
- C++笔试题深度分析 第二波 上
- C++笔试题深度分析 第三波 上
- C++笔试题深度分析 第四波 上
- 深度解析Objective-C笔试题
- 深度刨析 Objective-C笔试题
- 深度解析Objective-C笔试题
- 基础学习1:深度解析Objective-C笔试题
- C语言下强制转换的深度分析
- C/C++深度分析
- 【C】【笔记】《C语言深度剖析》第五章 内存管理
- 微软c语言循环递归笔试题分析
- 用MapReduce进行数据密集型文本处理 – 本地聚合(上)
- Balsamiq mockups 简介
- 排序算法——快速排序
- Apache Pig中文教程(进阶)
- Git GitHub初学
- C++笔试题深度分析 第五波 下
- 用MapReduce进行数据密集型文本处理 – 本地聚合(下)
- JAVA核心技术学习——流与文件(3.字符集)
- php_shell
- HDU 4081-Parsing URL(水)
- 习题1.16
- 用 Hadoop 计算共生矩阵
- 标准IO库、系统数据文件和信息 - UNIX环境高级编程-第5、6章
- C++实现求字符串的所有的组合