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 题解笔记 ...
随机推荐
- BZOJ2748_音量调节_KEY
[HAOI2012]音量调节 Time Limit: 3 Sec Memory Limit: 128 MB Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以 ...
- JAVA 一步一步向上爬
Java分为基本数据类型和引用数据类型(类.接口.数组) Integer.MAX_VALUE 浮点型默认为double java采用Unicode char为两个字节 Unicode为每一个字符定制了 ...
- “一切都是消息”--MSF(消息服务框架)入门简介
“一切都是消息”--这是MSF(消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,中文名称:消息服务框架,它是PDF.NET框架的一部分. 1,M ...
- 洗礼灵魂,修炼python(5)--python操作符,内置函数
前面提到了BIF(内置函数)这个概念,什么是内置函数,就是python已经定义好的函数,不需要人为再自己定义,直接拿来就可以用的函数,那么都有哪些BIF呢? 可以在交互式界面(IDLE)输入这段代码, ...
- JPEG流封装AVI视频
前言:前几天工作任务,要把JPEG流封装为AVI视频,就找了些AVI文件结构资料和示例代码研究了下,现将学习总结及最终完成的可用代码分享出来,由于本人也是现学现用,如有不恰当或错误之处,欢迎提出! 1 ...
- ThinkPHP5高阶实战教程
tp5项目:https://www.kancloud.cn/mikkle/thinkphp5_study/396283
- 18.Llinux-触摸屏驱动(详解)
本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次如下图所示, 其中事件处理层的函数都是通过input_register_handler()函数注册 ...
- hdu 4468 spy 极其精彩的一道kmp灵活运用题
出的超级好的一道题.至于好在哪里,请思考题目: 题意抽象出来为给定一个字符串r,找出它的一个最短后缀s,使得这个r可以被 s的某前缀+s的某前缀+......+s的某前缀+s本身构造出来. 具体题目描 ...
- Select的option事件问题
一开始看你们会觉得没问题,我也就是觉得没问题所以才找不到错误所在. 问题出在option本身是没有事件的说法的,只能在select里添加事件,再获取option的属性值 这是我的写法 select设置 ...
- mui框架移动开发初体验
前 言 博主最近在接触移动APP,学习了几个小技巧,和大家分享一下. 1. 状态栏设置 现在打开绝大多数APP,状态栏都是与APP一体,不仅美观,而且与整体协调.博主是个中度强迫症患者,顶部那个 ...