[算法学习]打印树的路径

问题描述: 输入一个整数sum和一棵二叉树,打印出二叉树中结点和为sum的所有路径。 (路径:从根结点往下一直到叶结点形成的一条路径。)

解法与分析:

  1. 需要从树上的根结点遍历到叶子结点,其中需要累加经过结点的值。
  2. 当累加到叶子结点时,比较累加结点值和sum的值,如果相等,打印出路径;如果不相等,返回到上一层,寻找其他叶子结点。
  3. 需要保存结点路径,还可以返回到上一个结点,可以选择用栈来保存经过结点。
  4. 可以使用递归来描述这个解法。

[算法学习]二叉搜索树转双向链表

问题描述: 将一棵二叉搜索树转成一条排序好的双向链表。要求不能创建新结点。

解法与分析:

  1. 由于左子树<根结点<右子树,所以双向链表的头结点是二叉搜索树左子树中的最后一个左结点,双向链表的头结点是二叉搜索树右子树中的最后一个右结点,根结点则是链表的中间结点。
  2. 将树结点中指向左孩子的指针作为双向链表中的前驱指针,指向右孩子的指针作为双向链表指向后继结点的指针。
  3. 按照上面分析,可以使用树的中序遍历来转换双向链表。这里我们使用递归的方式来实现中序遍历+双向链表转换。

[算法学习]栈的出栈序列

问题描述: 输入数字不重复的两组整数序列:压栈的序列A,出栈的序列B,验证AB是否为同一栈的序列。

解法与分析:

  1. 使用两个指针pA,pB分别在两个序列A,B上遍历。
  2. 做个这样的判断,首先判断两个指针所指元素是否相等,若相等,则两个指针同时推进;若不相等,取出栈顶元素作比较;若与栈顶元素不相等,则序列A的元素入栈,pA指针向前推进,若与栈顶元素相等,则出栈,pB指针推进。

[算法学习]栈中的最小值

问题描述: 实现栈的pop、push、 min (得到栈中最小值)方法。

解法与分析:

  1. 由于每次压栈和出栈都可能会改变栈中的最小值,所以,我们增加一个存放最小值的栈。
  2. 当出栈操作时,最小值的栈也出栈;(当然,必须判断栈是否为空)
  3. 当压栈操作时,比较压栈元素值和最小栈的栈顶元素的大小,若比较小,则将它压入栈中,若不是,则将最小栈的栈顶元素重复压栈。(当然,必须判断栈是否为空)

[算法学习]反转链表

问题描述: 输入一条链表,将链表反转后返回。

解法一:用递归

解法: 由于反转后头结点会成为尾结点,尾结点会成会头结点。所以从头结点开始反转前后结点关系。比较简单,所以这里直接贴出代码。

[算法学习]判断链表是否是环结构

问题描述: 判断链表是否是环结构。

解法与分析: 用两个指针的方法判断。

  1. 第一个指针在第一个结点,第二个指针在第二个结点处;
  2. 两个指针同时移动,第一个指针每次移动一个结点,第二个指针每次移动两个结点;
  3. 当第二个指针和第一个指针指向的结点是同一个时,链表有环。

[算法学习]求出链表中倒数第n个节点

问题描述: 求出链表中倒数第n个节点。例如:1,2,3,4,5,倒数第2个是4

解法与分析: 用两个指针的方法。

  1. 第一个指针起始位置在0位置,第二个指针起始位置在n-1位置。
  2. 两个指针同时移动,每次移动1个结点。
  3. 当第二个指针移动到最后一个节点时,第一个指针所指结点就是倒数第n个结点。