Algorithm/Tip:

现在正在依据 《labuladong 的算法小抄》刷算法。首先开始刷的 相关内容。
现在已经基本刷完《剑指 Offer》中 树 相关的题目,但是并没有形成什么概念,只是简单记住了一些简单的套路。

递归

在刷树相关的题目时,个人认为除了基本的循环外, 递归 是最需要了解的。

递归 最通俗的解释就是函数自己调自己。相比循环来说,递归要相对容易理解;但是递归的性能没有循环好,而且,如果递归函数没完没了的运行,很容易导致调用栈溢出。
递归调用栈 在每次递归调用时,会将递归函数压入调用栈,递归函数的每次调用都是独立的。

每个函数的调用都有它的一个独立的栈帧,其中包含了该函数的返回地址,参数和局部变量。每个栈帧对应着一个未完成的函数,当函数执行完之后,就会返回该函数的返回地址。

递归函数每次递归调用时,会将函数调用涉及的所有变量的值存储到调用栈中,存储函数详细内容的部分就是栈帧。
栈区的内存是编译器自动分配和释放的。是有大小限制的。
存储详尽信息会占用大量的内存,每个栈帧占用一定的内存,如果递归层数过高,那么就会导致调用栈占用的内存过高,当超过调用栈的内存限制时会触发栈溢出。

递归 要避免无休止的调用,需要设置必要的退出条件,用来停止递归。

常用二叉树

树中遇到最多是二叉树,即每个节点分出2个子节点,而每个子节点也分出2个两个子节点。当子节点不在往下分裂,这个子节点叫做叶节点。

当一个二叉树除最后一层节点外,其它所有的节点中都有两个子节点,这个二叉树就叫做 满二叉树

当一个二叉树除最后一层节点外,其它所有的节点都是有两个子节点;最后一层的最后一个节点落在左节点,并且最后一层的其它的节点都是连续的;这种节点叫做 完全二叉树

当一个二叉树的每个节点的父节点大于左节点(左子树不为空),并小于右节点(右子树不为空),则叫做 二叉搜索树

二叉搜索树

二叉搜索树是一种特殊的二叉树,它有特殊排列顺序。

  1. 一颗空树,可以认为是一种二叉搜索树;
  2. 若任意节点的左子树不为空,则左子树上所有节点的值均不大于它的根节点;
  3. 若任意节点的右子树不为空,则右子树上所有节点的值均不小于它的根节点;
  4. 任意节点的左、右子树也分别为二叉搜索树。

二叉树遍历模板

二叉树节点的定义

  1. public class TreeNode{
  2. int val;
  3. TreeNode left;
  4. TreeNode right;
  5. public TreeNode(){}
  6. public TreeNode(int val){
  7. this.val = val;
  8. }
  9. }

递归遍历模板

  1. void traverse(TreeNode root){
  2. if(root == null){
  3. return;
  4. }
  5. // root 节点需要做的事情,在这里执行
  6. // dealRootNode()
  7. // 递归遍历左子节点
  8. traverse(root.left);
  9. // 递归遍历右子节点
  10. traverse(root.right);
  11. }

二叉树的递归遍历,一般分为,前序,中序和后序遍历。
前序遍历:首先访问根节点,然后是左子节点,最后是右子节点;
中序遍历:首先访问左节点,然后是根子节点,最后是右子节点;
后序遍历:首先访问左节点,然后是右子节点,最后是根子节点。

其前序,中序和后序的区别在于,根节点的访问时机。如果先访问根节点就是前序遍历;如果最后访问跟根节点,则是后序遍历;如果在访问左节点和右节点之间访问根节点,则就是中序遍历。上面的遍历模板就是先序遍历。

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 运行。