113. Path Sum II

题目

分析:

主要考察二叉树深度优先遍历(DFS),递归调用当前节点的左右结点即可,代码如下(copy网上):

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 private:
12     vector<vector<int> > ret;
13 public:
14     void dfs(TreeNode *node, int sum, int curSum, vector<int> a)
15     {
16         if (node == NULL)
17             return;
18         
19         if (node->left == NULL && node->right == NULL)
20         {
21             if (curSum + node->val == sum)
22             {
23                 a.push_back(node->val);
24                 ret.push_back(a);
25             }
26             return;
27         }
28         
29         a.push_back(node->val);
30         dfs(node->left, sum, curSum + node->val, a);
31         dfs(node->right, sum, curSum + node->val, a);
32     }
33     
34     vector<vector<int> > pathSum(TreeNode *root, int sum) {
35         // Start typing your C/C++ solution below
36         // DO NOT write int main() function
37         ret.clear();
38         vector<int> a; 
39         dfs(root, sum, 0, a);
40         return ret;
41     }
42 };

上面的方法中,采用了递归,代码简单也利于理解,如果要是不采用递归该怎么求解呢?

 ---------------------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------

116. Populating Next Right Pointers in Each Node

题目

分析:

这是二叉树广度优先搜索的具体应用

代码如下:

 1 /**
 2  * Definition for binary tree with next pointer.
 3  * struct TreeLinkNode {
 4  *  int val;
 5  *  TreeLinkNode *left, *right, *next;
 6  *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     void connect(TreeLinkNode *root) {
12         if(NULL == root)
13             return;
14         
15         queue<TreeLinkNode*> myQue;
16         myQue.push(root);
17         myQue.push(NULL);//每一层的末尾添加一个NULL作为挡板
18         TreeLinkNode *temp;
19         while(!myQue.empty())
20         {    
21             temp = myQue.front();
22             myQue.pop();    
23             if(NULL != temp)
24             {
25                 while(NULL != temp)
26                 {
27                     temp->next = myQue.front();
28                     myQue.push(temp->left);
29                     myQue.push(temp->right);
30                     temp = myQue.front();
31                     myQue.pop();
32                 }
33                 myQue.push(NULL);
34             }            
35         }        
36     }
37 };

 -----------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------

121. Best Time to Buy and Sell Stock

题目

分析;

题目的意思就是给定一个数组,判断两个数差值最大,但是这个最大差值有个条件限制,就是前面一个数必须必后面一个数小。

这道题让我想起曾经看过的一道编程题,就是实现一个栈的Max函数,使得每时每刻都能获取栈中的最大值。这个函数的实现思想就是在每一层中都保存当前的最大值,如果有一个元素进栈,就和当前的最大值作比较,如果更大,就修改这个当前最大值。

这道题的思想也差不多,可以从后往前遍历数组,就相当于“进栈”,只不过这道题没有出栈操作。

代码如下:

 1 class Solution {
 2 public:
 3     int maxProfit(vector<int>& prices) {
 4         int size = prices.size();
 5         
 6         if(size<=1)
 7             return 0;
 8         
 9         int res=0;
10         int currentMax=prices[size-1];
11         
12         for(int i=size-1-1;i>=0;i--)//从倒数第二个数开始往前迭代
13         {
14             if(prices[i]>currentMax)
15             {
16                 currentMax = prices[i];
17             }
18             else
19             {
20                 if(currentMax - prices[i] > res)
21                     res = currentMax - prices[i];
22             }
23         }
24         return res;
25         
26     }
27 };