1.把数组排成最小的数
思路:定义一个新的排序规则。

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        /*对vector容器内的数据进行排序,按照将a和b转为string后
          若a+b<b+a  a排在在前的规则排序,
          如 2 21 因为 212 < 221 所以排序后为 21 2 
          to_string() 可以将int 转化为string*/
        int len=numbers.size();
        if(len==0) return "";//没有数,返回空字符串
        string result="";
        sort(numbers.begin(),numbers.end(),cmp);
        for(int i=0;i<len;i++)
        {
            result+=to_string(numbers[i]);
        }
        return result;
    }
    static bool cmp(int a,int b)//定义排序规则
    {
        string A=to_string(a)+to_string(b);
        string B=to_string(b)+to_string(a);
        return A<B;
    }
};

2.重建二叉树

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int len=pre.size();
        if(len<=0) return nullptr;
        TreeNode *head=new TreeNode(pre[0]);//前序遍历第一个节点即为根节点
        int gen=0;//寻找中序遍历根节点的位置
        for(int i=0;i<len;i++)
        {
            if(vin[i]==pre[0])
            {
                gen=i;
                break;
            }
        }
        vector<int> pl,pr,vl,vr;
        for(int i=0;i<gen;i++)
        {
            pl.push_back(pre[i+1]);
            vl.push_back(vin[i]);//把左子树的节点分别放入两个数组
        }
        for(int i=gen+1;i<len;i++)
        {
            pr.push_back(pre[i]);
            vr.push_back(vin[i]);//把右子树的节点分别放入两个数组
        }
        head->left=reConstructBinaryTree(pl,vl);
        head->right=reConstructBinaryTree(pr,vr);//递归进行上述操作
        return head;
    }
};