剑指offer------Day2
Posted Recently 祝祝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer------Day2相关的知识,希望对你有一定的参考价值。
之前写了一篇文章,当时想都没想发到一个群里,当我想撤回的时候,已经撤不回了,啥时候张小龙能普及微信管理员能测回超过两分钟的群消息就好了,然后看到一共同事看着我的文章再截图,当时我的心理(不要挂着一张囧字脸)。就是你没有心眼,但是在职场上还是不能随便说啥好一些,这件事让我对同事看到我的文章耿耿于怀,然后就不想分享了。就当做思路收集了。
Day2:剑指 Offer 07. 重建二叉树
力扣链接:剑指 Offer 07. 重建二叉树
我特别的恐慌二叉树,手写还行,像啥前序遍历呀,后续遍历呀,中序遍历啥的都OK,就是一开始学习数据结构的时候老师给我的心理阴影太大了,然后身边一群同学都说啥好难呀好难呀,其实你真的接触了之后,诶,也就那么回事儿。
题目:输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
题解:递归的方式解决问题,前序遍历第一个值是根节点,根据根节点把中序遍历分为左子树,右子树。根据下边规则,然后递归左子树,递归右子树。根
/**
* Definition for a binary tree node.
* public class TreeNode
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) val = x;
*
*/
class Solution
// 缓存中序遍历数组每个值对应的索引
Map< Integer, Integer > map = new HashMap();
public TreeNode buildTree(int[] preorder, int[] inorder)
if(preorder == null || preorder.length <= 0)
return null;
// 简历中序遍历数组的映射(就是为了快速求出某个元素的下标)
for(int i = 0; i < inorder.length; i++)
map.put(inorder[i], i);
TreeNode root = f(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
return root;
TreeNode f(int[] preorder, int l1, int r1, int[] inorder, int l2, int r2)
// 前序遍历或者中序遍历为空时,表示这棵树不存在,直接返回 null
if( l1 > r1 || l2 > r2)
return null;
// 根节点
TreeNode root = new TreeNode(preorder[l1]);
// 根节点在中序遍历中的下标
int i = map.get(preorder[l1]);
// 递归求解
root.left = f(preorder, l1 + 1, l1 + (i - l2), inorder, l2, i - 1);
root.right = f(preorder, l1 + (i - l2) + 1, r1, inorder, i + 1, r2);
return root;
Day2:剑指 Offer 09. 用两个栈实现队列
做提前一定要先看几遍题目,不然就会像我一样偶尔把提意弄错,然后思考好久。
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
题解:利用栈的思维实现队列的两个方法,通过模拟,建立两个栈,第一个栈将所有元素入队,后出队到第二个栈,(所以再队列尾部添加元素的思路就是再栈一种添加元素,然后再出队),第二个栈出队顺序就跟队列相同了。删除(若stack2有元素,则stack2全部出队后,再将stack1元素入队,stack2再出)
class CQueue
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue()
stack1 = new Stack();
stack2 = new Stack();
//加入尾部
public void appendTail(int value)
stack1.push(value);
public int deleteHead()
if(!stack2.isEmpty())
return stack2.pop();
if(!stack1.isEmpty())
while(!stack1.isEmpty())
stack2.push(stack1.pop());
return stack2.pop();
return -1;
End》》》
无人约束的生活,需要越自律才是真相!!!
以上是关于剑指offer------Day2的主要内容,如果未能解决你的问题,请参考以下文章