Leetcode题解(31)
103. Binary Tree Zigzag Level Order Traversal
题目

分析:
广度优先遍历的应用。重点是掌握vector的reverse函数,一开始我忘记有这个函数了,琢磨半天都没弄出来,后来想起reverse函数,问题一下子就迎刃而解。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;
vector<int> temp;
if(NULL == root)
return res; queue<TreeNode*> myQue;
TreeNode *temp1;
bool flag = true;
myQue.push(root); while (!myQue.empty())
{
temp.clear();
myQue.push(NULL);
temp1 = myQue.front();
myQue.pop();
while (NULL != temp1)
{
temp.push_back(temp1->val);
if(NULL != temp1->left)
myQue.push(temp1->left);
if(NULL != temp1->right)
myQue.push(temp1->right);
temp1 = myQue.front();
myQue.pop();
}
if(!flag)
{
reverse(temp.begin(),temp.end());
} res.push_back(temp);
flag = (!flag);
}
} };
---------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------
104. Maximum Depth of Binary Tree
题目

分析:
求树的深度,递归。代码如下:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode *root) {
if(NULL == root)return ;
int min1=;
int min2=;
min1 = maxDepth(root->left);
min2 = maxDepth(root->right); return (min1>min2 ? min1:min2)+; }
};
----------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------
105. Construct Binary Tree from Preorder and Inorder Traversal
题目;

分析:
题目要求利用前序、中序遍历构造一棵二叉树。
基本思想:通过前序遍历数组,找到当前子树的根节点在中序遍历数组中的下标,然后将中序遍历数组一分为二,一部分为左子树,一部分为右子树。递归调用构造完整的二叉树。
其中存在特殊情况,某个节点没有左子树,或者没有右子树,或者左右子树都不存在。
代码如下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int size = preorder.size();
if( == size)
return NULL;
//TreeNode *root = myBuild(preorder,inorder,0,0,size-1);这里不能直接传0,因为参数是引用
int index = ;
TreeNode *root = myBuild(preorder,inorder,index,,size-);
}
TreeNode* myBuild(vector<int>& preorder, vector<int>& inorder,int& index,int start,int end)//index为什么要用引用
{
//if(start == end)
//{
// return new TreeNode(inorder[start]);
//}
int i=start;
//for(;i<inorder.size();i++)
for(;i<=end;i++)
{
if(inorder[i] == preorder[index])
break;
} TreeNode *temp = new TreeNode(preorder[index]);
if(i == start)//当前节点没有左子树
temp->left = NULL;
else
temp->left = myBuild(preorder,inorder,++index,start,i-);
if(i == end)//当前节点没有右子树
temp->right = NULL;
else
temp->right = myBuild(preorder,inorder,++index,i+,end); return temp;
}
};
----------------------------------------------------------------------------分割线----------------------------------------------------------------
106. Construct Binary Tree from Inorder and Postorder Traversal
题目

分析:
通过二叉树的中序遍历和后序遍历来构造二叉树。
基本思想:通过后序遍历数组,找到当前子树的根节点在中序遍历数组中的下标,然后将中序遍历数组一分为二,一部分为左子树,一部分为右子树。递归调用构造完整的二叉树。
比较105和106题。可以发现,中序遍历数组在整个构造二叉树过程中起着"分岭"作用,如果只有前序和后序遍历,构造二叉树就比较麻烦了。
需要了解的是后序遍历数组中,最后一个节点就是当前子树的根节点,所以代码实现是从后序遍历数组的尾部开始,从后往前的遍历。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int size = postorder.size();
if( == size)
return NULL;
TreeNode *root = myBuild(inorder,postorder,,size-,size-);
}
//函数每次从postorder的尾部开始遍历,也就是从后往前遍历,参数index是指向当前需要访问postorder中的最后一个元素
TreeNode* myBuild(vector<int>& inorder, vector<int>& postorder,int start,int end,int index)//start,length是用于inorder数组中的,
{
//if(start == end)
//{
// return new TreeNode(inorder[start]);
//}
int i=start;
//for(;i<inorder.size();i++)
for(;i<=end;i++)
{
if(inorder[i] == postorder[index])
break;
}
//找到i下标,将inorder分为两部分,一部分是左子树,一部分是右子树
TreeNode *temp = new TreeNode(postorder[index]);
if(i == start)//当前节点没有左子树
temp->left = NULL;
else
temp->left = myBuild(inorder,postorder,start,i-,index-(end-i)-);//index-(end-i)-1是左子树的根节点在postorder中的下标
if(i == end)//当前节点没有右子树
temp->right = NULL;
else
temp->right = myBuild(inorder,postorder,i+,end,index-);//index-1是右子树的根节点在postorder中的下标 return temp;
}
};
Leetcode题解(31)的更多相关文章
- 【LeetCode题解】7_反转整数
目录 [LeetCode题解]7_反转整数 描述 方法一 思路 Java 实现 类似的 Java 实现 Python 实现 方法二:转化为求字符串的倒序 Java 实现 Python 实现 [Leet ...
- [LeetCode 题解]: plusOne
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a no ...
- [LeetCode 题解]: ZigZag Conversion
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 The string ...
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
- 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
随机推荐
- 自学Unity3D 之 贪吃蛇 添加摄像机跟随
在Unity的世界中, 物体的位置都是由向量构成的. 今天所需要做的就是让摄像机保持跟蛇头的相对距离. 首先 设蛇头的位置在A 点 , 摄像机的位置在B 点 则 我们可以知道 他们的offse ...
- AFN默认请求和响应的处理
1.默认的响应的解析 1.1 AFN默认不支持接受text/html数据类型,只需要增加即可 manager.responseSerializer.acceptableCont ...
- Ngnix技术研究系列2-基于Redis实现动态路由
上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台 ...
- 在linux上安装rz、sz包
在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于RHEL5, rz/sz默认没有安装所以需要手工安装.sz: 将选定的文件发送(send) ...
- Python内置类型(2)——布尔运算
python中bool运算符按优先级顺序分别有or.and.not, 其中or.and为短路运算符 not先对表达式进行真值测试后再取反 not运算符值只有1个表达式,not先对表达式进行真值测试后再 ...
- 虚拟机+桥接模式+Host-only模式 搭建完美的Windows下Linux开发环境
相信有很多鞋童和我一个样是一枚Linux码农(我现在还是嵌入式方向). 做Linux开发势必需要一个Linux环境, 大多数开发者会首先选择一个Linux发行版, 其中Ubuntu LTS版本应该是选 ...
- Echarts数据可视化legend图例,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- Opencv基础课必须掌握:滑动条做调色盘 -OpenCV步步精深
滑动条做调色盘 我们来想一下这个程序需要什么,首先需要一个窗口显示一切=.=(︿( ̄︶ ̄)︿废话一样): 说到调色盘除了画板也就是窗口(默认为黑色),调色就要涉及三种颜色 红色Red(我们用R表示), ...
- event模拟数据库链接
from threading import Thread,Event,currentThread import time e = Event() def conn_mysql(): count = 1 ...