剑指offer相关问题

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)

 

ref

 

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 }
View Code

思想就是:分治地去处理,每次处理一个范围,范围中的最末点即为root。从前向后遍历,找到第一个大于root的点作为分界点index,只要index到end没有小于root的了就说明是BST。

 

3. 二叉树中和为某一值的路径

该题即为leetcode的Path Sum II.

可以用后序遍历来做。第一次访问该节点时将其加入累积和及path中,第3次访问该节点时从累计和和path中减去,同时判断如果该节点是叶子节点的话是否符合累积和=target,等于的话就将其加入result。

 

posted @ 2015-08-18 14:37  Ryan in C++  阅读(235)  评论(0编辑  收藏  举报