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

参考以下这颗二叉搜索树:

5
    / \
   2   6
  / \
 1   3
示例 1:

输入: [1,6,3,2,5]
输出: false
示例 2:

输入: [1,3,2,6,5]
输出: true

提示:

数组长度 <= 1000

思路:找到第一个比根大的数字x,x右边所有数字都要比根大才符合定义。

然后对左右子树重复上述过程。

class Solution {int[] postorder;public boolean verifyPostorder(int[] postorder) {this.postorder=postorder;return verify(0, postorder.length - 1); }// 递归实现private boolean verify(int left, int right){if (left >= right) return true;int rootValue = postorder[right]; // 当前根// 找出第一个大于根节点的,右边必须都在右子树中int k = left;while (k < right && postorder[k] < rootValue){ k++;}//判断for (int i = k; i < right; i++){if (postorder[i] < rootValue) return false;}return verify(left, k - 1) && verify(k, right - 1);}
}

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:
给定如下二叉树,以及目标和 sum = 22,

5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1
返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

提示:

节点总数 <= 10000

思路:深搜+回溯

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {List<List<Integer>> ans=new ArrayList();List<Integer> temp=new ArrayList();public List<List<Integer>> pathSum(TreeNode root, int sum) {help(root,sum);return ans;}public void help(TreeNode root, int sum){if(root==null)return;temp.add(root.val);sum-=root.val;if(sum==0 && root.left==null && root.right==null){ans.add(new ArrayList(temp));}help(root.left,sum);help(root.right,sum);temp.remove(temp.size() - 1);}
}

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。

思路:先把每个节点后面复制一个相同的节点,为了方便处理好random。然后再分开即可。

空间O(1)

/*
// Definition for a Node.
class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}
*/
class Solution {public Node copyRandomList(Node head) {if (head == null) {return head;}//将拷贝节点放到原节点后面,例如1->2->3这样的链表就变成了这样1->1'->2'->3->3'for (Node node = head, copy = null; node != null; node = node.next.next) {copy = new Node(node.val);copy.next = node.next;node.next = copy;}//把拷贝节点的random指针安排上for (Node node = head; node != null; node = node.next.next) {if (node.random != null) {node.next.random = node.random.next;}}//分离拷贝节点和原节点,变成1->2->3和1'->2'->3'两个链表,后者就是答案Node newHead = head.next;for (Node node = head, temp = null; node != null && node.next != null;) {temp = node.next;node.next = temp.next;node = temp;}return newHead;}
}

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例:

你可以将以下二叉树:

1
   / \
  2   3
     / \
    4   5

序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

思路:我们普通的遍历(前序中序后序)序列,通常是不能唯一确定一个二叉树的,需要前中结合或者后中结合。是因为我们不知道哪里可以停止,比如例子中:到3时,我们不知道该挂到2的下面还是2两边都是null(3应该挂1的右边)。解决方法就是把所有的null记录下来,比如例子中的二叉树:前序:1,2,null,null,3,4,null,null,5,null,null。下面是在这种做法的实现。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {public String serialize(TreeNode root) {      //用StringBuilderreturn ser_help(root, new StringBuilder()).toString();}public StringBuilder ser_help(TreeNode root, StringBuilder str){if(null == root){str.append("null,");return str;}str.append(root.val); str.append(",");str = ser_help(root.left, str);str = ser_help(root.right, str);return str;}public TreeNode deserialize(String data) {List<String> list_word = new LinkedList<String>(Arrays.asList(data.split(",")));return deser_help(list_word);}public TreeNode deser_help(List<String> li){if(li.get(0).equals("null")){li.remove(0);return null;}TreeNode res = new TreeNode(Integer.valueOf(li.get(0)));li.remove(0);res.left = deser_help(li);res.right = deser_help(li);return res;}
}// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

剑指offer:33-37记录相关推荐

  1. 剑指offer:3-7记录

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  2. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  3. 剑指 Offer 33. 二叉搜索树的后序遍历序列

    剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...

  4. 剑指offer刷题记录 python3 Java

    剑指offer刷题记录 python3 Java 剑指 Offer 09. 用两个栈实现队列 剑指 Offer 10- I. 斐波那契数列 剑指 Offer 03. 数组中重复的数字 [★]剑指 Of ...

  5. 剑指offer做题记录

    1. 剑指 Offer 03. 数组中重复的数字   力扣 class Solution { public:int findRepeatNumber(vector<int>& nu ...

  6. 剑指Offer 刷题记录

    文章目录 剑指offer题目 01. 二维数组中的查找 02. 替换空格 03. 从尾到头打印链表 04. 重建二叉树 05. 两个堆栈模拟一个队列 06. 旋转数组的最小数字 07. 斐波那契数列 ...

  7. 剑指offer刷题记录(上)

    记录刷题过程,方便自己后期回顾 题目来自<剑指offer>,在牛客上OC,思路大多来自剑指offer,偶尔来自自己的碎碎念,代码自己瞎写的,如果有更优的方法请告诉我,谢谢大佬们 语言:py ...

  8. 剑指offer 33. 二叉搜索树的后序遍历

    声明:本系列博客是对何海涛<剑指offer>的关键点总结. 1.问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果,如果是返回true,否则返回false.假设输入的数 ...

  9. 剑指offer:39-42记录

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输 ...

最新文章

  1. 使用read write 读写socket
  2. 应用人工智能有助心理学发展
  3. 系统发生 1219 错误。 提供的凭据与已存在的凭据集冲突。
  4. MapReduce Java API-多输入路径方式
  5. SgmlReader使用方法
  6. ai字体行间距怎么调整_字体基础知识(一)
  7. java outofmemory 处理_java.lang.OutOfMemoryError处理错误
  8. 倒N字形排列java_Java排序8大算法实现
  9. java 拦截器ajax_(转)拦截器深入实践 - JAVA XML JAVASCRIPT AJAX CSS - BlogJava
  10. OCP-052考试题库汇总(59)-CUUG内部解答版
  11. 2018年12月份GitHub上最热门的Java开源项目
  12. 漫步凸分析七——凸函数闭包
  13. 求101-200以内的素数
  14. Ubuntu 下如何查看已安装软件版本
  15. springBoot构建Restful webService接口(医院)
  16. OD教程(去除NAG窗口--PE文件结构)
  17. 博思得标签打印机驱动_博思得打印机驱动
  18. 对大学的规划 计算机专业,对计算机专业的认识及你大学四年的规划与设想
  19. javaweb调用python修改微信运动步数,使用小米运动接口
  20. 10.如何使用 Node.js REPL

热门文章

  1. 自动化要不要学python-老男孩linux自动化运维|做人工智能为什么要学Python呢?
  2. childactor movable
  3. pycharm怎么编写python代码_如何设置PyCharm中的Python代码模版(推荐)
  4. oracle对某两列求和再求和_函数实战:多列条件求和
  5. 【转】GPS从入门到放弃(一) --- GPS基础原理
  6. 【转】ABP源码分析十九:Auditing
  7. 对比MS Test与NUnit Test框架
  8. jQuery Ajax 如何设置Timeout
  9. Oracle客房管理系统论文,[转载]基于WEB的酒店管理系统论文【1】
  10. java ppt转html_word,ppt,excel转pdf,pdf转html工具类搭建