diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 2d4a6e8e..7292b327 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -215,7 +215,7 @@ public String replaceSpace(StringBuffer str) { 输入链表的第一个节点,从尾到头反过来打印出每个结点的值。 -

+

## 解题思路 @@ -301,7 +301,7 @@ preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] ``` -

+

## 解题思路 @@ -339,11 +339,11 @@ private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, ① 如果一个节点有右子树不为空,那么该节点的下一个节点是右子树的最左节点; -

+

② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 -

+

```java public class TreeLinkNode { @@ -381,7 +381,7 @@ public TreeLinkNode GetNext(TreeLinkNode pNode) { in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,此时先进入的元素先退出,这就是队列的顺序。 -

+

```java Stack in = new Stack(); @@ -413,7 +413,7 @@ public int pop() { 如果使用递归求解,那么会重复计算一些子问题。例如,求 f(10) 需要计算 f(9) 和 f(8),计算 f(9) 需要计算 f(8) 和 f(7),可以看到 f(8) 被重复计算了。 -

+

递归方法是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,避免重复求解子问题。 @@ -797,11 +797,11 @@ private void printNumber(char[] number) { ① 如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,令该节点指向下下个节点,然后删除下一个节点,时间复杂度为 O(1)。 -

+

② 否则,就需要先遍历链表,找到节点的前一个节点,然后让前一个节点指向 null,时间复杂度为 O(N)。 -

+

综上,如果进行 N 次操作,那么大约需要操作节点的次数为 N-1+N=2N-1,其中 N-1 表示 N-1 个不是尾节点的每个节点以 O(1) 的时间复杂度操作节点的总次数,N 表示 1 个为节点以 O(n) 的时间复杂度操作节点的总次数。(2N-1)/N \~ 2,因此该算法的平均时间复杂度为 O(1)。 @@ -826,7 +826,7 @@ public ListNode deleteNode(ListNode head, ListNode tobeDelete) { ## 题目描述 -

+

## 解题描述 @@ -957,7 +957,7 @@ public void reOrderArray(int[] nums) { ## 解题思路 -

+

```java public ListNode FindKthToTail(ListNode head, int k) { @@ -982,7 +982,7 @@ public ListNode FindKthToTail(ListNode head, int k) { 在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 -

+

```java public ListNode EntryNodeOfLoop(ListNode pHead) { @@ -1040,7 +1040,7 @@ public ListNode ReverseList(ListNode head) { ## 题目描述 -

+

## 解题思路 @@ -1086,7 +1086,7 @@ public ListNode Merge(ListNode list1, ListNode list2) { ## 题目描述 -

+

## 解题思路 @@ -1109,7 +1109,7 @@ private boolean isSubtree(TreeNode root1, TreeNode root2) { ## 题目描述 -

+

## 解题思路 @@ -1132,7 +1132,7 @@ private void swap(TreeNode root) { ## 题目描述 -

+

## 解题思路 @@ -1156,7 +1156,7 @@ boolean isSymmetrical(TreeNode t1, TreeNode t2) { 下图的矩阵顺时针打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 -

+

## 解题思路 @@ -1240,7 +1240,7 @@ public boolean IsPopOrder(int[] pushA, int[] popA) { 例如,以下二叉树层次遍历的结果为:1,2,3,4,5,6,7 -

+

## 解题思路 @@ -1336,7 +1336,7 @@ public ArrayList> Print(TreeNode pRoot) { 例如,下图是后序遍历序列 3,1,2 所对应的二叉搜索树。 -

+

## 解题思路 @@ -1366,7 +1366,7 @@ private boolean verify(int[] sequence, int first, int last) { 下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12 -

+

## 解题思路 @@ -1398,21 +1398,21 @@ private void dfs(TreeNode node, int target, ArrayList path) { 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。 -

+

## 解题思路 第一步,在每个节点的后面插入复制的节点。 -

+

第二步,对复制节点的 random 链接进行赋值。 -

+

第三步,拆分。 -

+

```java public RandomListNode Clone(RandomListNode pHead) { @@ -1454,7 +1454,7 @@ public RandomListNode Clone(RandomListNode pHead) { 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 -

+

## 解题思路 @@ -2044,7 +2044,7 @@ private void merge(int[] nums, int first, int mid, int last) { ## 题目描述 -

+

## 解题思路 @@ -2140,7 +2140,7 @@ private void inOrder(TreeNode root, int k) { 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 -

+

## 解题思路 @@ -2157,7 +2157,7 @@ public int TreeDepth(TreeNode root) { 平衡二叉树左右子树高度差不超过 1。 -

+

## 解题思路 @@ -2557,7 +2557,7 @@ public int StrToInt(String str) { ### 二叉查找树 -

+

```java public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { @@ -2569,7 +2569,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { ### 普通二叉树 -

+

```java public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { diff --git a/pics/5acf7550-86c5-4c5b-b912-8ce70ef9c34e.png b/pics/5acf7550-86c5-4c5b-b912-8ce70ef9c34e.png new file mode 100644 index 00000000..e209482b Binary files /dev/null and b/pics/5acf7550-86c5-4c5b-b912-8ce70ef9c34e.png differ