剑指offer:33-37记录

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 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));

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指offer:45-48记录

输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [3,30,34,5,9] 输出: "3033459" 提示: 0 < nums.length < 100 说明:…

剑指offer:50-53记录

在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 示例: s "abaccdeff" 返回 "b" s "" 返回 " " 限制&#xff1a; 0 < s 的长度 < 50000 思路&#xff1a;map记录次数&#xff0c;再…

返回地址【数据结构】

小问题&#xff1f; 1.我们是如何根据地址值来找到我们对应的数据的&#xff1f; 详细陈述一下&#xff1a;当我们开辟一个整数类型&#xff0c;取名为a&#xff0c;假设地址空间是从数值为2000进行存储&#xff0c;并且我们假设整形占用4个字节&#xff0c;那么我们在内存中需…

【超级详细的小白教程】Hexo 搭建自己的博客

– 前言 这是一篇有关如何使用 Github Pages 和 Hexo 搭建属于自己独立博客的详尽教程&#xff0c;本人是软件工程专业本科生&#xff0c;目前只学习了C和C编程语言&#xff0c;对网站开发的有关知识几乎为零&#xff0c;这也是我搭建好自己的博客之后写的第一篇博客&#xff…

面向对象思想精华总结

一、三大特性 封装继承多态 二、类图 泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (Association)依赖关系 (Dependency) 三、设计原则 S.O.L.I.D其他常见原则 参考资料 一、三大特性 封装 利用抽象数据类型将数据…

insert函数的修改,

我们来看一下图片当中的第2个圆圈&#xff0c;为什么使用size来相加呢&#xff1f;我们知道一开始我们定义的初始空间为init_size;我们想一下啊&#xff0c;如果是第1次进行空间的增加&#xff0c;那么我们使用InIt来进行相加是可以的&#xff0c;但是当第2次想加我们再想开辟空…

【数据结构】线性表大咖

循环链表的介绍 概念&#xff1a;链表的最后一个节点的指针&#xff0c;由原来的 空指针变成指向第1个节点的链表。 类比&#xff1a;我们进行串珠子的操作&#xff0c;将首尾通过线进行连接&#xff0c;同样我们的链表就是通过指针指向的方式进行连接&#xff0c;使其成为一…

线性结构基本概念【数据结构】F

线性表的概念&#xff1a;线性表是一种最简单的线性结构&#xff0c;线性结构是单个数据元素的有序结合 线性结构的基本特征为&#xff1a; 第一&#xff0c;集合中必存在唯一的一个第1元素&#xff0c; 第二&#xff0c;集合中必存在唯一的一个最后元素&#xff0c; 第三&am…

leetcode589. N叉树的前序遍历

给定一个 N 叉树&#xff0c;返回其节点值的前序遍历。 例如&#xff0c;给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 思路&#xff1a;先放入自己&#xff0c;再依次遍历孩子。 /* // Definition for a Node. class Node {public int val;public List<Node> c…

顺序结构实现【数据结构】

虽然在数据结构当中是先出现的线性表&#xff0c;然后出现的是数组 一&#xff1a;线性表的顺序存储结构 顺序映象&#xff1a;用一组地址连续的存储单元依次存放线性表当中的数据元素 线性表的起始地址&#xff1a;线性存储第一个数据元素的地址&#xff0c;我们也称作是基地址…

leetcode590. N叉树的后序遍历

给定一个 N 叉树&#xff0c;返回其节点值的后序遍历。 例如&#xff0c;给定一个 3叉树 : 思路&#xff1a;先遍历所有孩子&#xff0c;再放入自己。 /* // Definition for a Node. class Node {public int val;public List<Node> children;public Node() {}public No…

链表的形式【F】

数据元素之间的关系在计算机中有两种表示方法: 顺序映象, 非顺序映象. 对应两种存储结构: 顺序存储结构, 链式存储结构 线性结构就是一种逻辑关系&#xff0c;方便我们对数据进行研究但是不考虑真实的存储结构 数据是什么&#xff1f; 数据是能够反应一定内容的一组数据类型的…

单链表的实现【数据结构】

思考&#xff1a; 1.是否能够将原来指针的方向改为向前指向呢&#xff1f; 2.是否能够有两个指针域的操作呢&#xff1f; 了解&#xff1a; 单链表是应用最广泛的一种形式&#xff0c;还有双向链表以及循环链表&#xff0c;这些都是要进行讨论的 结构体定义的是什么&#xff1f…

(详细图解)VS2017安装教程

VS 2017 版本同 15 版一样&#xff0c;细分为三个版本&#xff0c;分别是&#xff1a; 社区版&#xff08;Community&#xff09;&#xff1a;免费提供给单个开发人员&#xff0c;给予初学者及大部分程序员支持&#xff0c;可以无任何经济负担、合法地使用。企业版&#xff1a…

链表的代码实现【数据结构F】

单链表的特点&#xff1a;每次结点的分配都是动态进行分配的&#xff0c;melloc函数实现的功能是开辟一块新的内存空间&#xff0c;但是返回的是一个地址&#xff0c;只能是地址&#xff0c;没有别名的事情&#xff0c;那就有点难办了&#xff0c;这是一种间接的寻址&#xff0…

(图文详细)如何使用Code::Blocks运行c/cpp文件?

1) 新建源文件 打开 CodeBlocks &#xff0c;在上方菜单栏中选择 “文件 --> 新建 --> 空白文件”&#xff0c;如下图所示&#xff1a; 或者直接按下 Ctrl Shift N 组合键&#xff0c;都会新建一个空白的源文件&#xff0c;如下图所示&#xff1a; 在空白源文件中输入…

数据结构【插入操作具体代码的实现】

插入操作具体代码的实现 单链表delete的操作&#xff1a;

Linux GCC简明教程(编写c语言程序)

市面上常见的 Linux 都是发行版本&#xff0c;典型的 Linux 发行版包含了 Linux 内核、桌面环境&#xff08;例如 GNOME、KDE、Unity 等&#xff09;和各种常用的必备工具&#xff08;例如 Shell、gcc、VIM、Firefox 等&#xff09;&#xff0c;国内使用较多的是 CentOS、Ubunt…

解决VS'scanf':this function or variable may be unsafe.`(VS安全函数问题)

在 VS&#xff08;Visual Studio&#xff09;下编译C语言程序&#xff0c;如果使用了 scanf()、gets()、strcpy()、strcat() 等与字符串读取或操作有关的函数&#xff0c;有时候VS会报错&#xff0c;提示该函数可能不安全&#xff0c;并且建议替换为带有_s后缀的安全函数&#…

双向循环链表【数据结构】

单链表的缺点以及对单链表缺点的改进和双向链表的理解操作 双向循环列表的插入操作 线性结构是一种逻辑结构&#xff0c;顺序存储结构&#xff0c;链式存储结构