1. 变态跳台阶
Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n)
=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)+Fib(n-1)
而Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)
两式相减得:Fib(n) - Fib(n-1) = Fib(n-1) =====》 Fib(n) = 2*Fib(n-1)
2. 二叉搜索树的后序遍历序列
1 bool VerifySquenceOfBST(vector<int> sequence) { 2 if (sequence.empty()) { 3 return false; 4 } 5 return verifyBST(sequence, 0, sequence.size() - 1); 6 } 7 8 bool verifyBST(vector<int>& sequence, int start, int end) { 9 if (start >= end) { 10 return true; 11 } 12 int rootVal = sequence[end]; 13 int i; 14 for (i = start; i < end; i++) { 15 if (sequence[i] > rootVal) { 16 break; 17 } 18 } 19 int index = i; 20 for (; i < end; i++) { 21 if (sequence[i] < rootVal) { 22 return false; 23 } 24 } 25 return verifyBST(sequence, start, index - 1) && verifyBST(sequence, index, end - 1); 26 }
思想就是:分治地去处理,每次处理一个范围,范围中的最末点即为root。从前向后遍历,找到第一个大于root的点作为分界点index,只要index到end没有小于root的了就说明是BST。
3. 二叉树中和为某一值的路径
该题即为leetcode的Path Sum II.
可以用后序遍历来做。第一次访问该节点时将其加入累积和及path中,第3次访问该节点时从累计和和path中减去,同时判断如果该节点是叶子节点的话是否符合累积和=target,等于的话就将其加入result。