遍历

[leetcode] 99. 恢复二叉搜索树

让人想犯罪 __ 提交于 2019-12-04 02:32:06
99. 恢复二叉搜索树 一开始想了好久没有什么好思路,去网上搜了一下,原来是中序遍历。 二叉搜索树的中序遍历是个(递增)有序数列,利用这个特性,我们可以很巧妙的解决这个题。 先看第二个例子,中序遍历后是:13245,观察发现只有一处发生了降序,只在第二位与第三位发生了降序情况,说明这两个数为异常数,交换3和2的位置重新中序遍历:12345 第一个例子,中序遍历是:321,观察发现有两处发生了降序,第一到第二位,以及第二到第三位,这种情况下交换第一位与第三位即可 实际上题目中只有两个节点被交换了,所以降序情况最多也只会出现两处。所以分两种情况处理即可。 我们再造个例子,看的更直观点: [10 17 15 1 8 12 5] 中序遍历 1 17 8 10 12 15 5 17与3发生了降序,15与5发生了降序,我们将第一个降序的前一个元素与第二个降序的后一个元素,进行交换即可。 当只有一次降序出现时(可以理解为两个降序挤到了一块嘛),降序的前一个元素与降序的后一个元素,进行交换即可。 代码 class Solution { TreeNode p, q, last; void middle(TreeNode root) { if (root == null) return; middle(root.left); if (last != null && last.val > root

ES6深入浅出-5 新版对象-2.属性修饰符

时光总嘲笑我的痴心妄想 提交于 2019-12-04 01:43:28
对象语法增强 已经有了个对象的新增语法 还需要一个api来做呢?、 因为有的时候,你需要在旧的对象上添加get、set。 读的时候就走get 写的时候就走set 假设很早之前在项目里写了一个old对象,它的属性都是写好的,现在想给oldObject加get、set。没有办法再去重新定义它 这个api是给已经定好的对象,来不及再去重新定义的对象修改属性, 这样就可以设置oldObject的值为1. 但是set方法里面什么也没做。所以输出oldObject.x的值为undefined 这个api还有其他的功能,这些功能都是js的坑造成的 undefined是不是关键字呢? 如果一个东西是关键字,就没有办法声明同样的变量,function是个关键字,所以你没有办法声明一个关键字是function 同样的this也是一个关键字 可以声明变量undefined。所以undefined不是关键字。 null也事关键字不可以声明。 undefined是只读的变量 ,所以上面把undefined设置为1 没有设置成功。 常量a,设置a的值就会报错。 由此我们可以推断。undefined不是一个常量,因为我们可以给它赋值 如果undefined是变量的话 给它赋值,值却不变。所以它是不可改变值的变量。 所有的全局变量都是window上的属性而已。所以我们把undefined叫做window的只读属性

第105题:从前序与中序遍历序列构造二叉树

拥有回忆 提交于 2019-12-04 00:46:23
一. 问题描述 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 二. 解题思路 本题思路:了解前序遍历和中序遍历的特点并利用递归算法进行求解。前序特点:第一个元素必定是根节点,而中序遍历的特点是,根节点左右必定是左右子树的节点的集合。 步骤一:构建递归函数(前序遍历数组:preorder,int num 根节点在前序遍历数组的index值,当前中序遍历的list,root,当前根节点) 步骤二:通过preorder[num]找到当前中序遍历list中的左右子树所有值,并将左子树集合放入leftlist中,右子树集合放入rightlist中。 步骤三:通过前序中序原理,找到左子树集合和右子树集合的当前根节点root.left和root.right。并将num值变成当前根节点值的index。重复步骤一重复递归函数(preorder,newleftnum,leftlist,root.left)和(preorder,newrightnum,rightlist,root.right) 步骤四:当list中只剩下根节点时,则返回,最后输出root。 三. 执行结果

数据结构学习--Java遍历二叉树

柔情痞子 提交于 2019-12-03 23:56:29
一、遍历树 遍历树是根据一个特定的顺序访问树的每一个节点,根据顺序的不同分为前序、中序、后序遍历三种。 二、前序遍历   1、访问根节点   2、前序遍历左子树   3、前序遍历右子树 三、中序遍历   1、中序遍历左子树   2、访问根节点   3、中序遍历右子树 四、后序遍历   1、后序遍历左子树   2、后序遍历右子树   3、访问根节点 代码实现 package com.example.deer;public class Tree { //根节点 public Node root; /** * 插入节点 * @param value */ public void insert(long value,String sValue){ //封装节点 Node newNode = new Node(value,sValue); //引用当前节点 Node current = root; //引用父节点 Node parent; //如果root为null,也就是第一次插入的时候 if(root == null){ root = newNode; return; }else{ while (true){ //父节点指向当前节点 parent = current; //如果当前指向的节点数据比插入的要大,则向左走 if(current.data > value){ current =

二叉树的存储结构以及遍历

依然范特西╮ 提交于 2019-12-03 23:45:35
一、二叉树的存储结构 ————顺序存储(一维数组)——— 1 #define MaxSize 100 //假设二叉树最大编号为99 2 typedef char DataType; //定义二叉树节点的数据类型,假设为char型 3 typedef struct{ 4 DataType data[MaxSize]; 5 int biTreeNum; //二叉树的节点个数 6 }SeqBiTree; ——————二叉链表———————— 1 typedef char DataType; 2 typedef struct BiNode{ 3 DataType data; 4 struct BiNode * lchild,* rchild; 5 }BiNode; 二、二叉树的遍历 遍历过程 转载自https://mp.weixin.qq.com/s/HXce4H21Gbu_O9ciXzJQYw ————深度优先遍历———— 1.前序遍历 2.中序遍历 3.后序遍历 ————广度优先遍历———— 4.层序遍历 总结:a.我们提到的四种遍历方式,其实都是在把树种的结点编程某种意义上的线性序列,这样给程序执行带来了好处。 b.前序、中序、后序遍历最根本的区别就是双亲结点的访问时机——前序是先访问双亲结点,然后左孩子,最后右孩子;中序是左孩子,双亲,右孩子;后序是左孩子、右孩子最后双亲结点。 c

如何保护 .NET 应用的安全?

你离开我真会死。 提交于 2019-12-03 22:09:33
自从 Web 应用能给访问者提供丰富的内容之后,黑客们就把目光转向任何他们能够破坏,损毁,欺骗的漏洞。通过网络浏览器提供的应用越来越多,网络罪犯们可以利用的漏洞数量也呈指数增长起来。 大多数企业都依赖于网站向客户提供内容,与客户进行互动,销售产品。因此,企业会部署一些常用的技术来处理网站的不同请求。Joomla!或 Drupal 这样的内容管理系统或许能够建立包含产品、服务以及相关内容的健壮网站。此外,企业往往会使用 Wordpress 博客或基于 phpBB 的论坛这类依靠用户产出内容的社区,给客户提供评论和讨论的反馈平台。无论规模大小,对于直接在网上销售的电商企业,ZenCart 和 Magento 都能满足他们的需求。但再加上数千个网站依赖的专有应用程序,确保网络应用程序的安全应该是任何规模的网站管理者的首要问题。 ###与网络应用相关的风险 网络应用程序允许访问者访问网站最重要的资源——网络服务器和数据库服务器。和任何一款软件一样,网络应用程序的开发人员在产品和功能上花费了大量时间,却很少把时间用在安全上。当然,这并不是说开发人员不关心安全问题,实际情况绝非如此。真正的原因是,一方面,开发者对安全缺乏理解。另一方面,项目经理考虑安全问题的时间太少。 不管是什么原因,应用程序往往充满了漏洞。利用这些漏洞,攻击者可以访问 Web 服务器或数据库服务器。到那时候

面试准备 | 树相关的总结整理

前提是你 提交于 2019-12-03 21:33:19
树的遍历 前中后序遍历的6种实现方法(每种都有递归和循环两种)。 https://blog.csdn.net/liujiayu1015/article/details/52535829 剑指offer T26 34 55 7 33 (P62) 层序遍历:T32 二叉搜索树:左<根<右,O(logn)实现搜索,T36 68 堆和红黑树:堆分为最大堆和最小堆(快速查找最大、最小值)。 红黑树:把树中的节点定义为红、黑两种颜色,通过规则确保从根节点到叶节点的最长路径的长度不超过最短路径的两倍。 C++的STL基于红黑树的结构:set multiset map multimap 等 unordered_map? T40 来源: https://www.cnblogs.com/shona/p/11809684.html

[LeetCode]538. 把二叉搜索树转换为累加树

大憨熊 提交于 2019-12-03 21:29:28
题目 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。 例如: 输入: 二叉搜索树: 5 / \ 2 13 输出: 转换为累加树: 18 / \ 20 13 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/convert-bst-to-greater-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 题解 使用 反中序遍历 即右根左的顺序遍历 这样只需遍历一遍,因为二叉搜索树的性质保证了是从大到小遍历,每次更新累加值,并加到当前节点上更新节点值即可。 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { private int sum = 0; public TreeNode convertBST(TreeNode root) { if (root != null) { convertBST

ArrayList和LinkList的区别

牧云@^-^@ 提交于 2019-12-03 21:27:07
底层实现区别 ArrayList 底层实现就是数组, 且ArrayList实现了RandomAccess , 表示它能快速随机访问存储的元素, 通过下标 index 访问, 只是我们需要用 get() 方法的形式, 数组支持随机访问, 查询速度快, 增删元素慢; LinkedList 底层实现是链表, LinkedList 没有实现 RandomAccess 接口,链表支持顺序访问, 查询速度慢, 增删元素快 ArrayList和LinkedList遍历的区别 List 实现RandomAccess使用的标记接口,用来表明支持快速(通常是固定时间)随机访问。这个接口的主要目的是允许一般的算法更改它们的行为,从而在随机或连续访问列表时提供更好的性能。 将操作随机访问列表(比如 ArrayList )的最好的算法应用到顺序访问列表(比如 LinkedList )时,会产生二次项行为。鼓励一般的列表算法检查给定的列表是否 instanceof 这个接口,防止在顺序访问列表时使用较差的算法,如果需要保证可接受的性能时可以更改算法。 公认的是随机和顺序访问的区别通常是模糊的。例如,当一些 List 实现很大时会提供渐进的线性访问时间,但实际是固定的访问时间。这样的 List 实现通常应该实现此接口。通常来说,一个 List 的实现类应该实现这个接口 package com.example

Effective STL

天涯浪子 提交于 2019-12-03 20:53:04
STL(standard template library)提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以存若干个值。 STL容器是同质的,即存储的值的类型相同; 算法是 完成特定任务的处方;迭代器是能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。 STL不是面向对象编程,而是一种不同的编程模式-通用编程模式(generic programming)。 1. 慎重选择容器类型 标准STL序列容器: vector, string, deque 和 list. 标准STL关联容器:set, multiset, map 和 multimap. 非标准序列容器slist 和 rope. 非标准的关联容器 hash_set, hash_multiset, hash_map 和 hash_multimap. 基于算法复杂性考虑: vector是默认应使用的序列类型;当需要频繁地在序列中间做插入和删除操作时,应使用list;当大多数插入和删除操作发生在序列的头部和尾部时,deque是应考虑的数据结构。 STL一种分类方法:连续内存容器(contiguous-memory container)和 基于节点的容器(node-based container)。 2.