剑桥offer(51~60)
51.题目描述
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { }
};
*/
class Solution { TreeLinkNode* getNode(TreeLinkNode* pNode){
TreeLinkNode*pre = NULL;
while (pNode){
pre = pNode;
pNode = pNode->left;
}
return pre;
} public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
TreeLinkNode*tmp = pNode->next;
if (tmp){//如果有父节点
if (tmp->left == pNode&&pNode->right == NULL){//如果是左节点,就返回他的爸爸
return tmp;
}
else if (tmp->left == pNode&&pNode->right != NULL){
return getNode(pNode->right);
}
if (tmp->right == pNode){//如果是右节点,就返回他的右儿子
if (pNode->right){
return getNode(pNode->right);
}
else if (tmp->next->left == tmp){
return tmp->next;
}
else if (tmp->next->right == tmp){
return NULL;
}
}
}
else{//根节点
return getNode(pNode->right);
}
return NULL;
}
};
52.题目描述
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
return isSymmetrical(pRoot,pRoot);
} bool isSymmetrical(TreeNode* pRoot1,TreeNode* pRoot2)
{
if(pRoot1==NULL&&pRoot2==NULL)
return true;
if(pRoot1==NULL || pRoot2==NULL)
return false;
if(pRoot1->val!=pRoot2->val)
return false;
return isSymmetrical(pRoot1->left,pRoot2->right) && isSymmetrical(pRoot1->right,pRoot2->left); } };
53.题目描述
不使用reverse!!! 借助两个stack,分别为s1和s2。
1. 首先将根节点压入栈s1。
2. 将s1依次出栈,保存每个节点值,并依次将每个节点的左右节点压入栈s2
3. 将s2依次出栈,保存每个节点值,并依次将每个节点的右左节点压入本s1<注:这里是先压右子
节点再压左子节点>
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > result;
if (!pRoot) { return result; }
stack<TreeNode*> s1;
stack<TreeNode*> s2;
vector<int> temp;
s1.push(pRoot);
while (true) {
while (!s1.empty()) {
TreeNode* ptr = s1.top();
s1.pop();
if (!ptr) { continue; }
s2.push(ptr->left);
s2.push(ptr->right);
temp.push_back(ptr->val);
}
if (temp.empty()) { break; }
result.push_back(temp);
temp.clear();
while (!s2.empty()) {
TreeNode* ptr = s2.top();
s2.pop();
if (!ptr) { continue; }
s1.push(ptr->right);
s1.push(ptr->left);
temp.push_back(ptr->val);
}
if (temp.empty()) { break; }
result.push_back(temp);
temp.clear();
}
return result;
} };
54.题目描述
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) { queue<TreeNode*>qu1;
queue<TreeNode*>qu2;
vector<int> a;
vector<vector<int> >as;
if(!pRoot)
return as;
qu1.push(pRoot);
while(){
while(!qu1.empty()){
TreeNode* tmp=qu1.front();
qu1.pop();
if(!tmp)continue;
a.push_back(tmp->val);
qu2.push(tmp->left);
qu2.push(tmp->right);
}
if(a.empty()){break;}
as.push_back(a);
a.clear(); while(!qu2.empty()){
TreeNode* tmp=qu2.front();
qu2.pop();
if(!tmp)continue;
a.push_back(tmp->val);
qu1.push(tmp->left);
qu1.push(tmp->right);
}
if(a.empty()){break;}
as.push_back(a);
a.clear(); }
return as;
} };
55.题目描述
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
private:
TreeNode* decode(char *&str) {
if(*str=='#'){
str++;
return NULL;
}
int num = ;
while(*str != ',')
num = num* + (*(str++)-'');
str++;
TreeNode *root = new TreeNode(num);
root->left = decode(str);
root->right = decode(str);
return root;
}
public:
char* Serialize(TreeNode *root) {
if(!root) return "#";
string r = to_string(root->val);
r.push_back(',');
char *left = Serialize(root->left);
char *right = Serialize(root->right);
char *ret = new char[strlen(left) + strlen(right) + r.size()];
strcpy(ret, r.c_str());
strcat(ret, left);
strcat(ret, right);
return ret;
}
TreeNode* Deserialize(char *str) {
return decode(str);
}
};
56.题目描述
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution { public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
vector<TreeNode*>a; stack<TreeNode*>stack;
TreeNode* p = pRoot; while(p || !stack.empty()){
if(p!=NULL){
stack.push(p);
p = p->left;
}else{
p = stack.top();
a.push_back(p);
stack.pop();
p = p ->right;
}
} if(k > a.size()){
return NULL;
}else if(k == ){
return NULL;
}else{
return a[k-];
}
} };
57.题目描述
class Solution {
vector<int>a;
public:
void Insert(int num)
{
a.push_back(num);
}
double GetMedian()
{
vector<int>b=a;
sort(b.begin(), b.end());
if(b.size()% == ){
return b[b.size()/];
}else{
return (b[b.size()/]+b[b.size()/-])/2.0;
}
} };
58.题目描述
class Solution { int getVal(vector<int>v){
int max = v[];
for (int i = ; i<v.size(); i++){
if (max < v[i]){
max = v[i];
}
}
return max;
} public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int>a;
vector<int>tmp;
if (num.size()<size||size == )
return a;
for (int i = ; i<num.size() - size+; i++){
for (int j = ; j<size; j++){
tmp.push_back(num[j + i]);
}
a.push_back(getVal(tmp)); tmp.clear();
}
return a;
}
};
59.题目描述
60.题目描述
剑桥offer(51~60)的更多相关文章
- 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...
- 【Java】 剑指offer(51)数组中的逆序对
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成 ...
- 剑指offer 面试60题
面试60题 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 解决代码:
- 【Offer】[60] 【n个骰子的点数】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出s的所有可能的值出现的概率. [牛客网刷题地址]无 思路分析 递归的方 ...
- 【剑指Offer】60、按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题解:BFS 主要的方法与BFS写法没什么区 ...
- 剑指offer(60)把二叉树打印成多行
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 从上到下打印二叉树我们知道用队列可以实现,但是如果多行打印怎么做呢? 我们需要分割,在行与行之间进行分割.如何分割 ...
- 剑指Offer 51. 构建乘积数组 (数组)
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...
- [剑指Offer] 51.构建乘积数组
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...
- 剑桥offer(41~50)
41.题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). class Solution { pub ...
随机推荐
- HPUX 11.31 MC/SG恢复丢失的锁盘
有时候由于一些特殊的原因,用户的cluster中的锁盘信息丢失,或者需要更换锁盘,只要执行一个命令就可以了. #cmdisklock reset /dev/vglock:/dev/disk/diskX ...
- Shell 常用命令、基本用法总结
Filter Filter 常用于从大量文本.数据中提取需求的部分.下面介绍几个常用的 filter 命令. cut $ cut -c 5-8 textfile.txt # 切出 textfile.t ...
- LeetCode 142——环形链表 II
1. 题目 2. 解答 2.1 方法 1 定义快慢两个指针,慢指针每次前进一步,快指针每次前进两步,若链表有环,则快慢指针一定会相遇. 当快慢指针相遇时,我们让慢指针指向头节点,快指针不变,然后每次快 ...
- FFM
转载自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/details/77772565 点击率预估算 ...
- react创建新项目并且修改配置文件
react创建项目 这是我在用react搭建项目时,用到的一些东西,顺序纯属自己定义, 一.创建项目 用react 创建一个项目,这也是官方给出的 1.npm install create-react ...
- POJ 2104 K-th Number(划分树)
Description You are working for Macrohard company in data structures department. After failing your ...
- vue学习笔记之:为何data是一个方法
vue学习笔记之:为何data是一个方法 在vue开发中,我们可以发现,data中的属性值是在function中return出来的.可为何data必须是一个函数呢?我们先看官方的解释: 当一个组件被定 ...
- Internet History
Alan Turing and Bletchley Park Top secret breaking effort(二战破译希特勒密码) 10,000 people at the peak(team ...
- 如何:调试 .NET Framework 源代码
文章标题:如何:调试 .NET Framework 源代码 文章地址:https://technet.microsoft.com/zh-cn/cc667410.aspx
- 代码编写规范Asp.Net(c#)
1 目的 为了统一公司软件开发的设计过程中关于代码编写时的编写规范和具体开发工作时的编程规范,保证代码的一致性,便于交流和维护,特制定此规范. 2 范围 本规范适用于开发组 ...