摘要:
题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点。思路:如果有指向父亲的结点,则:如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点;否则,如果当前结点是父结点的左儿子,则后继结点就是父结点;(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先)否则,向... 阅读全文
摘要:
题目:给定一棵二叉树,将所有的结点都放到左儿子的位置,即除了root结点外,每一个结点都是其他某一个结点的左儿子。不用保持某种顺序,不能递归,O(1)空间。思路:我的想法是,维持一个遍历指针p,另一个指针tail永远指向向左遍历到底的结点;初始化p和tail都为root,开始循环:如果p为叶子结点,... 阅读全文
摘要:
反证法。素数的因式分解中,因子只有1和它本身。否则就是合数。假设素数是有限的,设为p1、p2、... 、pn,令px = p1 × p2 × ... × pn + 1,px除以任一个素数pi (1 <= i <= n) 的余数都是1,则px只能被1和其本身整除,px也是素数。与假设条件相矛盾,则素数... 阅读全文
摘要:
题目:单链表的归并排序,返回排序后的链表。传统的归并都是数组,可以随机访问元素,链表则需要顺序遍历找中间结点。思路:设置两个指针,一个步长为1, 一个步长为2,当快指针到达尾结点时,慢指针指向中间结点,时间复杂度为O(N);平分为左链表L1和右链表L2,递归分裂,直到链表为空或者只有一个结点;将链表... 阅读全文
摘要:
原理和方法可以参考: 图的深度优先遍历教科书上的C代码,递归: 1 //教科书方法,邻接表 2 bool visited[MAX]; 3 void visitFunc(int v); 4 5 void dfsTraverse(Graph G) 6 { 7 for(v = 0; v vis... 阅读全文