剑指offer之21-25题解


目录

  1. 栈的压入,弹出序列
  2. 从上往下打印二叉树
  3. 二叉搜索树的后序遍历序列
  4. 二叉树中和为某一值的路径
  5. 复杂链表的复制

21. 栈的压入,弹出序列

(一)题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

(二) 思路

  1. 使用一个栈来模拟压入弹出操作。
  2. stack每入栈一个元素,就去判断栈顶元素是否与弹出数组的popIndex元素是否相同,相同就pop。
  3. 最后判断stack是否为null,为null说明弹出序列是正确的,否则错误。

(三)代码实现

import java.util.Stack;
public class Solution {public boolean IsPopOrder(int[] pushA, int[] popA) {int n = pushA.length;Stack<Integer> stack = new Stack<>();for (int pushIndex = 0, popIndex = 0; pushIndex < n; pushIndex++) {stack.push(pushA[pushIndex]);while (popIndex < n && !stack.isEmpty() && stack.peek() == popA[popIndex]) {stack.pop();popIndex++;}}return stack.isEmpty();}
}

22. 从上往下打印二叉树

(一)题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

(二) 思路

  1. 创建一个队列和list数组。
  2. 当队列不为null时获取队列的size,当cnt–>0,队列弹出一个元素,将元素值加入list数组,然后添加它的左右孩子。
  3. 跟着演变一遍就能看懂。

(三)代码实现

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Solution {public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();ArrayList<Integer> ret = new ArrayList<>();queue.offer(root);while (!queue.isEmpty()){int cnt = queue.size();while (cnt-->0){TreeNode t = queue.poll();if (t == null)continue;ret.add(t.val);queue.offer(t.left);queue.offer(t.right);}}return ret;}
}

23. 二叉搜索树的后序遍历序列

(一)题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

注:二叉搜索树中序遍历就是递增的,如下的中序遍历为1,2,3.

(二) 思路

  1. 输入的后序遍历,最后一个即为根节点,根节点的左边都比它小,根节点的右边都比它大。依次递归。

(三)代码实现

public class Solution {public boolean VerifySquenceOfBST(int[] sequence) {if (sequence == null || sequence.length == 0) return false;return verify(sequence, 0, sequence.length - 1);}private boolean verify(int[] sequence, int first, int last) {if (last - first <= 1)return true;int rootVal = sequence[last];int cutIndex = first;while (cutIndex < last && sequence[cutIndex] <= rootVal) cutIndex++;for (int i = cutIndex; i < last; i++) if (sequence[i] < rootVal) return false;return verify(sequence, first, cutIndex - 1) && verify(sequence, cutIndex, last - 1);}
}

24. 二叉树中和为某一值的路径

(一)题目描述

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

(二) 思路

  1. backtracking()方法中,当target == 0 && node.left == null && node.right == null说明已找到和为target路线,并且是最后一个节点。所以直接加入ret即可。否则递归回溯
  2. 因为不能确定只有一条路线,所以最后path.remove(path.size() - 1)

(三)代码实现

public class Solution {private ArrayList<ArrayList<Integer>> ret = new ArrayList<>();public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {backtracking(root, target, new ArrayList<Integer>());return ret;}private void backtracking(TreeNode node, int target, ArrayList<Integer> path) {if (node == null)return;path.add(node.val);target -= node.val;if (target == 0 && node.left == null && node.right == null) {ret.add(new ArrayList<>(path));} else {backtracking(node.left, target, path);backtracking(node.right, target, path);}path.remove(path.size() - 1);}
}

25. 复杂链表的复制

(一)题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

(二) 思路

  1. 在每个节点的后面插入复制的节点
  2. 对复制节点的random链接进行赋值
  3. 拆分


(三)代码实现

public class Solution {public RandomListNode Clone(RandomListNode pHead) {if (pHead == null) {return null;}//插入新节点RandomListNode cur = pHead;while (cur != null) {RandomListNode clone = new RandomListNode(cur.label);clone.next = cur.next;cur.next = clone;cur = clone.next;}//建立random连接cur = pHead;while (cur != null) {RandomListNode clone = cur.next;if (cur.random != null) clone.random = cur.random.next;cur = clone.next;}//拆分cur = pHead;RandomListNode pCloneHead = pHead.next;while (cur.next != null) {RandomListNode next = cur.next;cur.next = next.next;cur = next;}return pCloneHead;}
}

剑指offer之21-25题解相关推荐

  1. 【重点】剑指offer——面试题25:二叉树中和为某一值的路径

    剑指offer--面试题25:二叉树中和为某一值的路径 参考网址:https://www.nowcoder.com/profile/5488508/codeBookDetail?submissionI ...

  2. 【剑指offer】java版题解(持续更新)

    本文为刷[剑指]备战校招的过程,持续更新 备战虽晚但卷,共勉! 目录,按刷题时间排序 斐波那契数列 用两个栈实现队列 二维数组中的查找 包含min函数的栈 从尾到头打印链表 反转链表 复杂链表的复制 ...

  3. 两个有序链表序列的交集_剑指offer第21天:合并两个有序链表

    我准备了 1000 本电子书和计算机各领域高清思维导图 100 张,关注后回复[资源],即可获取!更可回复[内推]加入 BAT 内推群! 01.题目分析 第21题:合并两个有序链表 将两个有序链表合并 ...

  4. 【剑指offer】21、调整数组顺序使奇数在偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分. 思路一 从前往后扫描数组,遇到一个偶数就把它放到数组末尾,并且把之后 ...

  5. 剑指offer(21)从上往下打印二叉树

    public class Solution {public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {//创建俩个数列 ...

  6. 剑指offer(21)栈的压入、探出序列

    链接:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106 思路:借用一个辅助的栈,遍历压栈顺序,先将第 ...

  7. 剑指offer(21)栈的压入、弹出序列

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该 ...

  8. 剑指offer面试题25. 合并两个排序的链表(双指针)

    题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 思路 详见链接 代码 class Solution:def mergeTwolists(self, l1:List ...

  9. C++剑指offer刷题笔记

    说明:本文是本人刷题后整理的剑指offer1-68题的题解笔记,编程语言为c++. 主要参考刷题笔记网址:leetcode剑指offer 次要参考刷题笔记网址:牛客剑指offer 剑指OFFER 面试 ...

  10. 【剑指offer】数据结构——数组

    目录 数据结构--数组 直接解 [剑指offer]03.数组中重复的数字 排序法 集合法 原地置换 [剑指offer]04. 二维数组中的查找 [剑指offer]29. 顺时针打印矩阵 [剑指offe ...

最新文章

  1. linux 查看 文档 不显示注释 命令
  2. jQuery中 trigger() bind() 使用心得
  3. 基本数据类型转换 || 自动类型转换与强制类型转换
  4. 编程方法学25:设计实用社交网络
  5. 关于计算机的发展过程及基础知识正确的是,2011doc-计算机基础知识.doc
  6. 模式匹配算法Index
  7. 读书印记 - 《技术元素》
  8. c++静态变量的生存期
  9. delphi7存储过程传入数组_数据结构线性表之顺序存储 类的封装
  10. Springboot: Failed to get nested archive for entry BOOT-INF/lib/ Zip64 archives are not supported
  11. jquery click点击事件重复执行多次
  12. wps如何使用ppt美化大师_WPS的ppt一键美化软件怎么用
  13. Origin在保存多因子箱线图模板时,怎样在下次应用时,直接使用RAW数据?
  14. 社交网络分析的 R 基础:(一)初探 R 语言
  15. Unity (NavMeshAgent 导航系统)
  16. 划片机是芯片切割制造流程中一个重要的环节
  17. 关于手机常见音频POP音产生的原因以及解决思路(一)——耳机插入与拔出
  18. Ubuntu16.04装拼音/Sogou遇到的问题(卸载/重装 Fcitx / Fcitx Configuration、卸载/重装Sogou)
  19. HLk-v20一v20s详细资料地址
  20. mysql数据库修改密码

热门文章

  1. 图片处理 javax.imageio.IIOException: Unsupported Image Type
  2. 介绍几款开源好用的产品
  3. 【208天】黑马程序员27天视频学习笔记【Day21-中】
  4. 【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?
  5. 针对C64x+的一些优化经验
  6. cocos工程里面“”invalid ''cobl” in fuction xxx原理与解决方案
  7. HDU - 3613 Best Reward(字符串哈希)
  8. 动态规划算法-02矿工挖矿问题
  9. 计算机组成原理模拟试题,计算机组成原理模拟试题及答案
  10. POJ1269(判断线段相交)