93. Restore IP Addresses

题目

分析:多重循环,判断小数点合适的位置

代码如下(copy网上)

 1 class Solution {
 2 public:
 3     vector<string> restoreIpAddresses(string s) {
 4         vector<string> ret;
 5         if(s.size() > 12)
 6             return ret;
 7         for(int i = 0; i < s.size(); i ++)
 8         {// [0, i]
 9             for(int j = i+1; j < s.size(); j ++)
10             {// [i+1, j]
11                 for(int k = j+1; k < s.size()-1; k ++)
12                 {// [j+1, k], [k+1, s.size()-1]
13                     string ip1 = s.substr(0, i+1);
14                     string ip2 = s.substr(i+1, j-i);
15                     string ip3 = s.substr(j+1, k-j);
16                     string ip4 = s.substr(k+1);
17                     if(check(ip1) && check(ip2) && check(ip3) && check(ip4))
18                     {
19                         string ip = ip1 + "." + ip2 + "." + ip3 + "." + ip4;
20                         ret.push_back(ip);
21                     }
22                 }
23             }
24         }
25         return ret;
26     }
27     bool check(string ip)
28     {
29         int value = stoi(ip);
30         if(ip[0] == '0')
31         {
32             return (ip.size() == 1);
33         }
34         else
35         {
36             if(value <= 255)
37                 return true;
38             else
39                 return false;
40         }
41     }
42 };

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

94. Binary Tree Inorder Traversal

题目

分析:二叉树的中序遍历,题目要求不能使用递归,因此为了实现中序遍历,需要使用一个stack,只是在存储节点的 时候,中间节点利用两个NULL包裹起来存放。详细请看代码中的注释,代码如下:

 1 /**
 2  * Definition for a binary tree node.
 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 public:
12     vector<int> inorderTraversal(TreeNode* root) {
13         vector<int> res;
14         if(root == NULL)
15             return res;
16         stack<TreeNode*> myStack;
17         TreeNode *temp;
18         myStack.push(root);
19         while(!myStack.empty())
20         {
21             temp = myStack.top();
22             myStack.pop();
23             
24             if(NULL == temp)//表示访问到中间节点了,需要读取val
25             {
26                 temp = myStack.top();
27                 myStack.pop();
28                 res.push_back(temp->val);
29                 temp = myStack.top();
30                 myStack.pop();
31                 continue;                
32             }
33             //右节点push
34             if(temp->right != NULL)
35                 myStack.push(temp->right);
36             
37             //利用两个NULL把中间节点包裹起来
38             myStack.push(NULL);
39             myStack.push(temp);
40             myStack.push(NULL);
41             
42             //左节点push
43             if(temp->left != NULL)
44             {                
45                 myStack.push(temp->left);
46             }
47         }
48         return res;
49         
50     }
51 };

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

95. Unique Binary Search Trees II

题目

分析:递归求解,代码如下(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 public:
12     vector<TreeNode *> generateTrees(int n) {
13         vector<TreeNode *> res;
14         if(n==0)
15         return res;
16         return Helper(1, n);
17     }
18     vector<TreeNode *> Helper(int begin, int end)
19     {
20         vector<TreeNode *> ret;
21         if(begin > end)
22             ret.push_back(NULL);
23         else if(begin == end)
24         {
25             TreeNode* node = new TreeNode(begin);
26             ret.push_back(node);
27         }
28         else
29         {
30             for(int i = begin; i <= end; i ++)
31             {//root
32                 vector<TreeNode *> left = Helper(begin, i-1);
33                 vector<TreeNode *> right = Helper(i+1, end);
34                 for(int l = 0; l < left.size(); l ++)
35                 {
36                     for(int r = 0; r < right.size(); r ++)
37                     {
38                         //new tree
39                         TreeNode* root = new TreeNode(i);
40                         root->left = left[l];
41                         root->right = right[r];
42                         ret.push_back(root);
43                     }
44                 }
45             }
46         }
47         return ret;
48     }
49 };

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

96. Unique Binary Search Trees

题目

分析:这题和95题是一样的,代码如下(copy网上代码):

 1 class Solution {
 2 public:
 3     int numTrees(int n) {
 4         int f[n+1];
 5         memset (f , 0 , sizeof(int)*(n+1));
 6         f[0]=1;
 7         for(int i=1; i<=n; i++)
 8             for(int j=0; j<i; j++)
 9                 f[i] += f[j] * f[i-j-1];
10         
11         return f[n];
12     }
13 };