Algorithm/Tip:
现在正在依据 《labuladong 的算法小抄》刷算法。首先开始刷的 树
相关内容。
现在已经基本刷完《剑指 Offer》中 树 相关的题目,但是并没有形成什么概念,只是简单记住了一些简单的套路。
递归
在刷树相关的题目时,个人认为除了基本的循环外, 递归
是最需要了解的。
递归
最通俗的解释就是函数自己调自己。相比循环来说,递归要相对容易理解;但是递归的性能没有循环好,而且,如果递归函数没完没了的运行,很容易导致调用栈溢出。递归调用栈
在每次递归调用时,会将递归函数压入调用栈,递归函数的每次调用都是独立的。
每个函数的调用都有它的一个独立的栈帧,其中包含了该函数的返回地址,参数和局部变量。每个栈帧对应着一个未完成的函数,当函数执行完之后,就会返回该函数的返回地址。
递归函数每次递归调用时,会将函数调用涉及的所有变量的值存储到调用栈中,存储函数详细内容的部分就是栈帧。
栈区的内存是编译器自动分配和释放的。是有大小限制的。
存储详尽信息会占用大量的内存,每个栈帧占用一定的内存,如果递归层数过高,那么就会导致调用栈占用的内存过高,当超过调用栈的内存限制时会触发栈溢出。
递归
要避免无休止的调用,需要设置必要的退出条件,用来停止递归。
常用二叉树
树中遇到最多是二叉树,即每个节点分出2个子节点,而每个子节点也分出2个两个子节点。当子节点不在往下分裂,这个子节点叫做叶节点。
当一个二叉树除最后一层节点外,其它所有的节点中都有两个子节点,这个二叉树就叫做 满二叉树。
当一个二叉树除最后一层节点外,其它所有的节点都是有两个子节点;最后一层的最后一个节点落在左节点,并且最后一层的其它的节点都是连续的;这种节点叫做 完全二叉树。
当一个二叉树的每个节点的父节点大于左节点(左子树不为空),并小于右节点(右子树不为空),则叫做 二叉搜索树。
二叉搜索树
二叉搜索树是一种特殊的二叉树,它有特殊排列顺序。
- 一颗空树,可以认为是一种二叉搜索树;
- 若任意节点的左子树不为空,则左子树上所有节点的值均不大于它的根节点;
- 若任意节点的右子树不为空,则右子树上所有节点的值均不小于它的根节点;
- 任意节点的左、右子树也分别为二叉搜索树。
二叉树遍历模板
二叉树节点的定义
public class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(){}
public TreeNode(int val){
this.val = val;
}
}
递归遍历模板
void traverse(TreeNode root){
if(root == null){
return;
}
// root 节点需要做的事情,在这里执行
// dealRootNode()
// 递归遍历左子节点
traverse(root.left);
// 递归遍历右子节点
traverse(root.right);
}
二叉树的递归遍历,一般分为,前序,中序和后序遍历。
前序遍历:首先访问根节点,然后是左子节点,最后是右子节点;
中序遍历:首先访问左节点,然后是根子节点,最后是右子节点;
后序遍历:首先访问左节点,然后是右子节点,最后是根子节点。
其前序,中序和后序的区别在于,根节点的访问时机。如果先访问根节点就是前序遍历;如果最后访问跟根节点,则是后序遍历;如果在访问左节点和右节点之间访问根节点,则就是中序遍历。上面的遍历模板就是先序遍历。
Review/Share
英文文章,暂时以 Java Virtual Machine Specification ,Java SE 8 Edition 为主。
这一版的 JVM 规范,整合了 Java SE 7 Edition 之前的所有对 JVM 所做的修改。另外,为了与当前流行的 JVM 实现保持一致,该版本的规范还做了很多的更正和说明。
JVM 规范只是一部规范。JVM 的实现只要在必须的时候遵从它的规范即可。
Java 语言是一般通用的,并发的,面向对象的语言。它的语法与 C/C++ 非常类似。但是 Java 摒弃了 C/C++ 中那些让人感到迷惑,复杂和一些不安全的部分。
JVM 是 Java 平台的基石。Java 不依赖硬件和系统,编译的代码量相对要少,而且 Java 的安全很高。Java 实现这些能力的技术部分就是由 JVM 提供的。
JVM 是一种抽象的计算机。它有一些指令集,在运行时会操作各种内存区域。
JVM 不采用任何特定的实现技术,主机硬件或者操作系统。JVM 针对的不是 Java 语言,而是针对特定的二进制格式,即 class 文件格式。一个 class 文件包含 JVM 指令或者字节码,还有一些符号表和其它的辅助信息。
为了安全起见,JVM 对 class 文件强加了特定的语法和结构上的约束。不管是 Java 语言还是 groovy 还是其他的语言,只要能生成符合 JVM 的规范的 class 文件,就可以在 JVM 运行。