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 题解笔记 ...
随机推荐
- 【实验吧】Reverse400
在网上下载,pyinstxtractor.py,对Reverse400.exe进行反汇编 得到其源代码为 $ cat Revesre03 data = \ "\x1c\x7a\x16\x77 ...
- spring实例化dataSource使用jndi和jdbc两种方式
一.使用jndi的方式 这种方式方便测试人员不需要改代码,直接改变tomcat的server.xml就可以更改数据库连接 spring创建bean <bean id="dataSour ...
- GCD之线程挂起与恢复
我们可以使用dispatch_suspend函数暂停一个queue以阻止它执行block对象;使用dispatch_resume函数继续dispatch queue.调用dispatch_suspen ...
- 用mp3stego来加密与解密文件的几次尝试
用法来自实验吧的"Canon"隐写题目的灵感. 先来简单的聊一下这道题目,打开题目后发现了一个mp3文件,除此之外还有一枚压缩包.然而压缩包是加密的,看来我们需要通过解出来mp3里 ...
- mysql error 1130 hy000:Host 'localhost' is not allowed to connect to this mysql server 解决方案
ERROR 1130 (HY000): Host 'localhost' is not allowed to connect to this MySQL server D:\Wamp\mysql-\b ...
- 多个activity跳转保留内存使用intent传递数据问题_新手
/////本来是做的activity跳转,普通那种,但是会在调回来会销毁原来的,重新调用onCreate方法, 后来参考[http://blog.csdn.net/qq_26918031/articl ...
- Elixir游戏服设计二
搞一个例子,而没有实际的目标,做起来真是烦人.几次三番都想放弃. 后来想想,即使最后完成不了完整的服务器,把需要的知识点搞搞,摸熟悉也是好的. 这里没有完整的项目目录,主要是对需要的指点进行整理.要完 ...
- 深入理解C# 静态类与非静态类、静态成员的区别 [转载]
静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...
- 将网页封装成苹果APP的牛逼方法,无需发布到appstore,无需越狱即可安装
很多小伙伴都在开发自己的app, 有的实现实现比较简单,就是一个h5页面,然后想要打包成app发布出去. 这个想法很单纯 打包生成个app这个是很简单的,网上一堆打包工具,分分钟可以完成 但是... ...
- structs2的核心和工作原理
在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的 ...